Как найти координаты вершины прямоугольника с координатами



Ученик

(94),
закрыт



8 лет назад

Globe

Просветленный

(24815)


8 лет назад

Получаете координаты трех вершин: (x1, y1) (x2, y2) (x3, y3)
Выясняете, какой угол – прямой:

(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1) = 0, значит, прямой угол – при вершине (x1, y1)
тогда координаты четвертой вершины равны:
x = x1 + (x2-x1) + (x3-x1)
y = y1 + (y2-y1) + (y3-y1)

(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2) = 0, значит, прямой угол – при вершине (x2, y2)
тогда координаты четвертой вершины равны:
x = x2 + (x1-x2) + (x3-x2)
y = y2 + (y1-y2) + (y3-y2)

(x1-x3)*(x2-x3)+(y1-y3)*(y2-y3) = 0, значит, прямой угол – при вершине (x3, y3)
тогда координаты четвертой вершины равны:
x = x3 + (x1-x3) + (x2-x3)
y = y3 + (y1-y3) + (y2-y3)

????
PROFIT!

Великий ЗомбиниУченик (94)

8 лет назад

“Выясняете, какой угол – прямой: “
Вот честно даже читать дальше не стала.. . я же написала ПРЯМОУГОЛьник

Великий ЗомбиниУченик (94)

8 лет назад

вот знаешь.. . это все хоть и работает, а я всеравно не знаю откуда ты все это взял. но я разберусь. спасибо)

Максим (Некромант)

Просветленный

(28848)


8 лет назад

это же элементарно

просишь в вести координаты вершины (их всего три)

это значит по два числа на вершину (Х и У) – создаешь при этом масив двух мерный

и загоняешь туда последовательно 3 отданых числа х и у

далее создаем некую логику

нас интересует всего лишь введенные первые координаты и третие

проверяем что бы х1 не равнялся x3 (тоесть проверяем что бы х первого числа не ровнялся х терьего числа ) – если не ровняется тогда х ровняется первому введеному чеслу х – а у третьему введенному числу Y – далее если все же Х третьего числа равняется Х первого числа тогда Х ровняется второго введенного числа Х а У третьего !

вот и вся логика

Великий ЗомбиниУченик (94)

8 лет назад

Что-то не сходится.

Если нам вводят координаты

1; 1
1; 3
3; 3

то, следуя вашей логике, мы получаем координаты 1; 3. Правильно я считаю? Но неизвестная вершина находится в координатах 3; 1

Сергей Марков

Мудрец

(10064)


8 лет назад

Добрый день.
Немного теории.

Исходя из свойств прямоугольника в общем виде координаты вершин (обозначим их А, B, C, D) можно представить в таком виде:

A(x, y); B(x+a,y)

C(x. y+b); D(x+a, y+b)

Можно видеть, что множество значений x имеет значения {x, x+a, x, x+a}, и множество значений y имеет значения {y, y, y+b, y+b}

Теперь представим, что мы получаем в произвольном порядке значения координат трех вершин, и если они принадлежат прямоугольнику, то они будут принадлежать указанным выше множествам и подчиняться их свойствам. Другими словами, из трех значений x – два значения обязательно будут равны, то же самое со значениями y.

Теперь дело техники.

Немного практики.

На Паскале это можно реализовать, например так:

Исходные значения координат я задал в программе, Вы же можете использовать команду ввода с клавиатуры, но тогда необходимо задать проверку координат на принадлежность их прямоугольнику.

Успехов.

Великий ЗомбиниУченик (94)

8 лет назад

“из трех значений x – два значения обязательно будут равны, то же самое со значениями y.”
Вот здесь вы наверно ошибаетесь. Если прямоугольник будет наклонен? Что-то типа этого)

Так, как я понял задачу. Есть обычная декартова система координат, прямоугольник, стороны a и b, одна его точка, и он повернут относительно этой точки на угол.

Вопрос в том, как он располагался ранее, что за длины a и b.

  A3
  -------a------<- A2
  |            |
  b            |
  |            |
  --------------
  ^            ^
  A0           A1

Если представить картину таким образом, то все предельно просто. A0, естественно, остается на месте.

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

Если это то, что нужно вам. Но в общем случае прямоугольник-то уже мог быть изначально ориентирован как угодно. Вам нужно четко ставить задачу – даже для самого себя, а иначе получается “мне надо что-то посчитать!” – “ну возьмите какие-нибудь формулы…”

Контрольные задания > Даны координаты трёх вершин прямоугольника ABCD: А (-4; -2), С (2; 4) и D (2; -2). Начертите этот прямоугольник. Найдите координаты вершины В. Найдите координаты точки пересечения диагоналей прямоугольника. Вычислите площадь и периметр прямоугольника, считая, что длина единичного отрезка координатных осей равна 1 см.

Ответ:

[2) B( – 4;4).]

[3) E( – 1;1).]

[4) S = 6 cdot 6 = 36 см^{2}.]

[P = 2 cdot (6 + 6) = 2 cdot 12 = 24 см. ]

Похожие

  • Даны координаты трёх вершин прямоугольника ABCD: A (−1; −3), C (5; 1) и D (5; −3).
  • Даны координаты трёх вершин прямоугольника ABCD: A (−2; −2), B (−2; 4) и D (6; −2).
  • Даны координаты трёх вершин прямоугольника ABCD: A (−2; −3), B (−2; 5) и C (4; 5).
  • Даны координаты трёх вершин прямоугольника ABCD: B(−3;6); C(5;6) и D(5;−2).
  • Даны координаты трёх вершин прямоугольника ABCD: А (-1; -1), В (-1; 3) и D (5; -1). Начертите прямоугольник ABCD. Найдите координаты вершины С. Найдите координаты точки пересечения диагоналей прямоугольника. Вычислите площадь и периметр прямоугольника, считая, что длина единичного отрезка координатных осей равна 1 см.
  • Даны числа 289, 441, 577. Выберите те из них, которые можно представить в виде квадрата некоторого числа, и запишите соответствующее равенство (используйте таблицу квадратов двузначных чисел).
  • Даны числа 3/7, 2/3 и 0,3. Какое из них самое маленькое?
  • Даны числа 3/7, 3/5 и 0,7. Какое из них самое большое?
  • Даны числа 361, 442, 576. Выберите те из них, которые можно представить в виде квадрата некоторого числа, и запишите соответствующее равенство (используйте таблицу квадратов двузначных чисел).
  • Даны числа 4/9, 3/4 и 0,4. Какое из них самое маленькое?

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given an N * M grid. It contains exactly three ‘*’ and every other cell is a ‘.’ where ‘*’ denotes a vertex of a rectangle. The task is to find the coordinates of the fourth (missing) vertex (1-based indexing).
    Examples: 
     

    Input: grid[][] = {“*.*”, “*..”, “…”} 
    Output: 2 3 
    (1, 1), (1, 3) and (2, 1) are the given coordinates of the rectangle where (2, 3) is the missing coordinate.
    Input: grid[][] = {“*.*”, “..*”} 
    Output: 2 1 
     

    Approach: Find the coordinates of the 3 vertices by iterating through the given grid. Since a rectangle consists of 2 X-coordinates and 2 Y-coordinates and 4 vertices, every X-coordinate and Y-coordinate should occur exactly twice. We can count how many times each X and Y coordinate occurs in the 3 given vertices and the 4th one will have coordinates that occur only once.
    Below is the implementation of the above approach: 
     

    C++

    #include <bits/stdc++.h>

    using namespace std;

    pair<int, int> findFourthVertex(int n, int m, string s[])

    {

        unordered_map<int, int> row, col;

        for (int i = 0; i < n; i++)

            for (int j = 0; j < m; j++)

                if (s[i][j] == '*') {

                    row[i]++;

                    col[j]++;

                }

        int x, y;

        for (auto tm : row)

            if (tm.second == 1)

                x = tm.first;

        for (auto tm : col)

            if (tm.second == 1)

                y = tm.first;

        return make_pair(x + 1, y + 1);

    }

    int main()

    {

        string s[] = { "*.*", "*..", "..." };

        int n = sizeof(s) / sizeof(s[0]);

        int m = s[0].length();

        auto rs = findFourthVertex(n, m, s);

        cout << rs.first << " " << rs.second;

    }

    Java

    import java.util.HashMap;

    import java.util.Map;

    class GfG

    {

        static Pair<Integer, Integer> findFourthVertex(int n,

                                            int m, String s[])

        {

            HashMap<Integer, Integer> row = new HashMap<>();

            HashMap<Integer, Integer> col = new HashMap<>();

            for (int i = 0; i < n; i++)

            {

                for (int j = 0; j < m; j++)

                {

                    if (s[i].charAt(j) == '*')

                    {

                        if (row.containsKey(i))

                        {

                            row.put(i, row.get(i) + 1);

                        }

                        else

                        {

                            row.put(i, 1);

                        }

                        if (col.containsKey(j))

                        {

                            col.put(j, col.get(j) + 1);

                        }

                        else

                        {

                            col.put(j, 1);

                        }

                    }

                }

            }

            int x = 0, y = 0;

            for (Map.Entry<Integer, Integer> entry : row.entrySet())

            {

                if (entry.getValue() == 1)

                    x = entry.getKey();

            }

            for (Map.Entry<Integer, Integer> entry : col.entrySet())

            {

                if (entry.getValue() == 1)

                    y = entry.getKey();

            }

            Pair<Integer, Integer> ans = new Pair<>(x + 1, y + 1);

            return ans;

        }

        public static void main(String []args)

        {

            String s[] = { "*.*", "*..", "..." };

            int n = s.length;

            int m = s[0].length();

            Pair<Integer, Integer> rs = findFourthVertex(n, m, s);

            System.out.println(rs.first + " " + rs.second);

        }

    }

    class Pair<A, B>

    {

        A first;

        B second;

        public Pair(A first, B second)

        {

            this.first = first;

            this.second = second;

        }

    }

    Python3

    def findFourthVertex(n, m, s) :

        row = dict.fromkeys(range(n), 0)

        col = dict.fromkeys(range(m), 0)

        for i in range(n) :

            for j in range(m) :

                if (s[i][j] == '*') :

                    row[i] += 1;

                    col[j] += 1;

        for keys,values in row.items() :

            if (values == 1) :

                x = keys;

        for keys,values in col.items() :

            if (values == 1) :

                y = keys;

        return (x + 1, y + 1) ;

    if __name__ == "__main__" :

        s = [ "*.*", "*..", "..." ]

        n = len(s);

        m = len(s[0]);

        rs = findFourthVertex(n, m, s);

        print(rs[0], rs[1])

    C#

    using System;

    using System.Collections.Generic;

    class GfG

    {

        static Pair<int, int> findFourthVertex(int n,

                                            int m, String []s)

        {

            Dictionary<int, int> row = new Dictionary<int, int>();

            Dictionary<int, int> col = new Dictionary<int, int>();

            for (int i = 0; i < n; i++)

            {

                for (int j = 0; j < m; j++)

                {

                    if (s[i][j] == '*')

                    {

                        if (row.ContainsKey(i))

                        {

                            row[i] = row[i] + 1;

                        }

                        else

                        {

                            row.Add(i, 1);

                        }

                        if (col.ContainsKey(j))

                        {

                            col[j] = col[j] + 1;

                        }

                        else

                        {

                            col.Add(j, 1);

                        }

                    }

                }

            }

            int x = 0, y = 0;

            foreach(KeyValuePair<int, int> entry in row)

            {

                if (entry.Value == 1)

                    x = entry.Key;

            }

            foreach(KeyValuePair<int, int> entry in col)

            {

                if (entry.Value == 1)

                    y = entry.Key;

            }

            Pair<int, int> ans = new Pair<int, int>(x + 1, y + 1);

            return ans;

        }

        public static void Main(String []args)

        {

            String []s = { "*.*", "*..", "..." };

            int n = s.Length;

            int m = s[0].Length;

            Pair<int, int> rs = findFourthVertex(n, m, s);

            Console.WriteLine(rs.first + " " + rs.second);

        }

    }

    class Pair<A, B>

    {

        public A first;

        public B second;

        public Pair(A first, B second)

        {

            this.first = first;

            this.second = second;

        }

    }

    Javascript

    <script>

    function findFourthVertex(n, m, s)

    {

        var row = new Map(), col = new Map();

        for (var i = 0; i < n; i++)

            for (var j = 0; j < m; j++)

                if (s[i][j] == '*') {

                    if(row.has(i))

                        row.set(i, row.get(i)+1)

                    else

                        row.set(i, 1)

                    if(col.has(j))

                        col.set(j, col.get(j)+1)

                    else

                        col.set(j, 1)

                }

        var x, y;

        row.forEach((value, key) => {

            if (value == 1)

                x = key;

        });

        col.forEach((value, key) => {

            if (value == 1)

                y = key;

        });

        return [x + 1, y + 1];

    }

    var s = ["*.*", "*..", "..." ];

    var n = s.length;

    var m = s[0].length;

    var rs = findFourthVertex(n, m, s);

    document.write( rs[0] + " " + rs[1]);

    </script>

    Time Complexity: O(N*M), as we are using a loop to traverse N*M times.
     Auxiliary Space: O(N + M), as we are using extra space for map.

    Last Updated :
    31 May, 2022

    Like Article

    Save Article

    Vote for difficulty

    Current difficulty :
    Basic

    Есть прямоугольник, чьи вершины заданы левой верхней точкой (x1, y1) и правой нижней (x2, y2). Необходимо произвести вращение прямоугольника вокруг произвольной точки (x0, y0) на угол α и найти координаты всех вершин после поворота.

    Теория

    Используем аффинные матрицу поворота и матрицу переноса. Формулы для нахождения координат при повороте следующие:

    Latex formula

    Latex formula

    Точка вокруг которой хотим повернуть изображение имеет координаты O (x0, y0) . Чтобы получить значение x и y для формул выше, необходимо их нормализовать.

    Latex formula

    Latex formula

    Смещение D(x,y) определяет, куда хотим поместить точку вращения после поворота. В подавляющем большинстве случаев оно равно точке вращения.

    Окончательный вид формул:

    Latex formula

    Latex formula

    Интерактив

    На интерактиве ниже работают только эти формулы. «Произвольная» точка вращения зазывно мигает. Дескать, можно таскать. За вершины «не-повернутого» серого прямоугольника также можно таскать, меняя тем самым исходные координаты. При изменении координат происходит масштабирование с таким расчетом, чтобы «влез» процесс поворота. Делать на всю ширь возможных орбит смысла не увидел, т.к. они могут быть астрономически большими.

    Переключатель «Математическая координатная сетка» показывает родную для математиков систему координат с центром координат посередине и осью Y, направленной вверх. Если режим выключен, демонстрируется координатная сетка, привычная для программистов — начало координат в левом верхнем углу и ось Y направлена вниз.

    Переключатель «Анимация» включает плавное изменение угла с целью медитативного эффекта познания сущего.


    Вращать вокруг центра прямоугольника

    Все координаты находятся в отрицательном секторе!
    При отключенном режиме математической сетки данные могут быть не видны!


    Чтобы их увидеть включите режим математической сетки и сдвиньте точку вращения в положительный сектор, который находится в правом верхнем квадранте.

    Get a better browser, bro…

    Математическая координатная сетка

    Немного кода

    Delphi

    //   Посчитать координаты точки повернутой на Angle радиан

    function CalcAnglePoint(const ACenter, APoint: TPointF;

    const Angle: Single): TPointF;

    var

      sn,cs: single;

    begin

      SinCos(Angle, sn, cs);

      Result.X := (APoint.XACenter.X) * cs

        (APoint.YACenter.Y) * sn + ACenter.X;

      Result.Y := (APoint.XACenter.X) * sn +

        (APoint.YACenter.Y) * cs + ACenter.Y;

    end;

    JavaScript

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

        // расчет координат вершин по углу и центру вращения

        // angle – угол в радианах

        // center – точка, вокруг которой происходит вращение

        // points – массив с координатами вершин прямоугольника

        // vpoints – массив с повернутыми координатами вершин

        // массивы points и vpoints должны быть одной размерности

    ssin = Math.sin(angle);

    scos = Math.cos(angle);

    for (let i = 0; i < points.length; i++) {

    vpoints[i].x = center.x + (points[i].x center.x) * scos

                    (points[i].y center.y) * ssin;

    vpoints[i].y = center.y + (points[i].x center.x) * ssin +

                    (points[i].y center.y) * scos;

    }

    Вращение прямоугольника вокруг произвольной точки и нахождение координат вершин производится таким незамысловатым кодом. Стоит отметить, что функции применимы к любому количеству вершин. Таким образом можно посчитать координаты любого многоугольника.


    Друзья, спасибо за внимание!

    Подписывайтесь на телегу.

    Пишите комментарии.

    Спрашивайте.

    Поискать похожие темы на сайте.

    Добавить комментарий