Как найти четвертую координату прямоугольника

Мозг

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

(45393)


11 лет назад

Достаточно просто, если прямоугольник расположен на экране, а не под каким-нибудь углом в 47 градусов. Для этого, находим координаты по x и y у всех точек. Каждое значение должно повторяться дважды. Какие значения повторятся лишь один раз, те и есть у неизвестной точки.
Поясню на примере. Выше вам нарисовали прямоугольник ABDC
Допустим, неизвестна точка B (координаты) .
Возьмём для простоты такие значения для точек:
A (1, 3)
C (1, 7)
D (4, 7)
7 это координата игрек и она повторяется дважды: у точек C и D, которые находятся на одной вертикальной прямой.
точка 1 по икс есть у точек A и C, они расположены на одной прямой по оси икс.
Точка 3 по игрек есть только у A. Соответственно, раз она лишь однажды повторяется по оси игрек, то второй раз она повторится у точки B. Тогда координата по игрек у B равна 3.
Точка 4 по иксу есть лишь у точки D. Значит, второй раз она будет у B.
Соответственно, точка B имеет координаты B (4, 3)
Это справедливо лишь для прямоугольников, не имеющих сдвига относительно экрана.
Для сдвинутых на определённый угол, скажем на 53 градуса, нужно вычислить вначале, какая именно точка неизвестна (через сравнение координат) , а потом по относительному смещению (разница между координатами на параллельных сторонах) найти нужные координаты.
Приведу простой пример:
Имеет прямоугольник ABCD

Сверяем известные координаты по иксу, имеем значения -5, 1 и 7 и по игреку 8, 3 и 11 соответственно. Находим длины отрезков AB, BD, DA через сумму квадратов разницы их координат
AD ^ 2 (в квадрате) = (1 – (-5)) ^ 2 + (3 – 8) ^ 2 = (6 ^ 2 + (-5) ^ 2) = 36 + 25 = 61
Значит AB = корень квадратный из 61 или просто 61 ^ 0.5
Также находим длину AB ^ 2= (1 – 7) ^ 2 + (3 – 11) ^ 2 = 36 + 64 = 100
AB = 100 ^ 0.5 = 10
DB ^ 2 = (-5 -7) ^ 2 + (8 – 11) ^ 2 = (-12) ^ 2 + (-3) ^ 2 = 144 + 9 = 153
DB = 153 ^ 0.5
Так как мы знаем координаты трёх точек, то они в любом случае (в прямоугольнике) составляют прямоугольный треугольник. Нам важно выяснить, какая из сторон самая длинная (она будет гипотенузой, а значит, точка, не участвующая в границах отрезка гипотенузы, будет противоположна той, что неизвестна. В нашем случае мы получили отрезки длиной
153 ^ 0.5, 61 ^ 0.5 и 100 ^ 0.5.
При проверке на равенство оно не выполняется (ошибка) 100 + 61 != 153. Но это потому что я от балды нарисовал прямоугольник. В действительности, просто у прямоугольника, с точками A (1, 3) и D(-5, 8) точка B не может иметь координат (7, 11) . Хотя бы одна из координат будет немного отличаться.
Ну да ладно – это ведь просто наглядный пример, и мне некогда тут высчитывать точное равенство.
Тогда мы узнали, что самая длинная сторона, получающаяся из известных точек, это сторона DB. А значит, раз точка А не является концом этой стороны, то мы можем утверждать, что абсцисса (координата X) неизвестной точки C находится по неравенству Ax – Dx = Bx – Cx
Тогда Cx = Bx – Ax + Dx
Подставим известные абсциссы, получим
Cx = 7 – 1 + (-5) = 1
А ордината C (координата по Y) находится из неравенства:
Ay – Dy = By – Cy
Cy = By – Ay + Dy
Cy = 11 – 3 + 8 = 16
Итого, получили координаты точки C (1, 16), что является верным ответом.
Можно вычислить координаты C немного по-другому:
Ax – Bx = Dx – Cx
Cx = Dx – Ax + Bx
Cx = -5 – 1 + 7 = 1
Ay – By = Dy – Cy
Cy = Dy – Ay + By
Cy = 8 – 3 + 11 = 16
То есть, для получения неизвестной точки мы складываем координаты точек гипотенузы треугольника, составленного из известных точек, и вычитаем точку, объединяющую катеты.
Ничего сложного, элементарная геометрия за 7 класс. Прочитайте ещё раз внимательно.

Источник: Тут всё очень просто.

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

    Мне нужен мой код, чтобы найти 4-ую вершину прямоугольника. Пытался что-то сделать но как всегда не получилось. Это работает в некоторых случаях, бот не каждый раз. Может ли кто-нибудь помочь мне с этим?
    Кроме того, это должно быть сделано с 2 классами, один для вершин и другой для целого прямоугольника.
    Проблема в том, что мой код работает для определенной настройки вершины. Я много чего пробовал, но все равно не получилось.

    Вот код:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    class vertex{
    public:
    double x;
    double y;
    void insert(){
    cin>>x;
    cin>>y;
    }
    };
    
    class rect{
    private:
    double ax, ay, bx, by, cx, cy, dx, dy;
    public:
    void insert_data(vertex A, vertex B, vertex C){         //inserting rectangle data
    ax=A.x;
    ay=A.y;
    bx=B.x;
    by=B.y;
    cx=C.x;
    cy=C.y;
    }
    void calculate(){           //finding 4h vertex coordinates
    dx=cx+(abs(ax-bx));
    dy=cy+(abs(ay+by));
    }
    void out(){                 //output
    cout<<dx<<" "<<dy;
    }
    
    };
    using namespace std;
    
    int main() {
    vertex A, B, C;
    A.insert();
    B.insert();
    C.insert();
    rect X;
    X.insert_data(A, B, C);
    X.calculate();
    X.out();return 0;
    }
    

    Поскольку я думаю об этом сейчас, он может иметь какое-то отношение к вставке координат в правильные переменные, но не может придумать решение, чтобы это исправить.

    Например:
    Входные данные:
    1 1
    0 3
    3 2
    Выход:
    2 4

    Порядок ввода каждой вершины не указан.

    3

    Решение

    Если у вас есть три вершины, то у вас есть половина прямоугольника: прямоугольный треугольник. Сначала нужно определить, какая точка находится под прямым углом. Вы можете сделать это по-разному. Один из способов — применить теорему Пифагора: найти две самые дальние вершины. Оставшаяся вершина находится под прямым углом (другим способом может быть вычисление скалярного произведения между каждой парой ребер, а та, которая ближе всего к нулю, образует прямой угол).

    Давайте назовем вершину под прямым углом Aи два других B а также C, Теперь векторы двух более коротких ребер прямоугольного треугольника B-A а также C-A, Если вы добавите эти края в Aвы получите 4-ю вершину:

    D=A+(B-A)-(C-A)=B+C-A

    2

    Другие решения

    Работа с векторами — очень интересная тема. Вот несколько хороших объяснений о вектор

    Чтобы ответить на ваш вопрос:

    Из трех заданных вершин A, B и C у вас есть только три случая прямого угла: в A, в B или в C. Если вы нашли правильный угол, например, в B (независимо от порядка A и C) , у вас есть координата D, рассчитанная по формуле: D = A + C — B.

    Чтобы определить, что прямой угол равен B: произведение точек двух векторов BA и BC равно 0, независимо от порядка A и C.

    В C ++ (не C) вы должны добавить операторы для управления векторами в вашем классе вершин, вот пример:

    #define MY_EPSILON 10E-6
    
    class vertex {
    public:
    double X, Y;
    vertex(double x_, double y_ ) :X(x_), Y( y_){}
    vertex():X(0), Y(0){}
    
    vertex operator +( vertex v ){ return vertex( X + v.X, Y + v.Y ); }
    vertex operator -( vertex v ){ return vertex( X - v.X, Y - v.Y ); }
    double dot( vertex v ){ return X * v.X + Y * v.Y; }
    double length() { return sqrt(X * X + Y * Y ); }
    vertex normalize( bool &bOk ){
    double len = length(); bOk = false;
    if( len > MY_EPSILON ){  bOk = true; return vertex( X/len, Y/len ); }
    return *this;
    }
    };
    
    std::ostream & operator << ( std::ostream & s, vertex v ){
    s << std::setprecision(6) << "(" << v.X << "," << v.Y << ") ";
    return s;
    }
    

    Точечное произведение двух векторов:

    Чтобы проверить, находится ли прямой угол в точке B, мы можем использовать следующую функцию, она вычислит произведение точек двух нормализованных векторов AB и BC:

    bool isRighAngle( vertex a, vertex b, vertex c){
    bool bOkAB, bOkBC;
    vertex uAB = ( b - a ).normalize( bOkAB ), uBC = ( c - b ).normalize( bOkBC );
    return bOkAB && bOkBC && fabs(uAB.dot( uBC )) < MY_EPSILON;
    }
    

    Обратите внимание, что когда мы сравниваем двойное значение с нулем, всегда используем эпсилон, для двойного нет абсолютного нуля. Эта функция также возвращает false, если один из нормализованных векторов не может быть вычислен (две точки расположены слишком близко друг к другу).

    Вычислить последнюю координату под прямым углом:

    Эта следующая функция возвращает true, если последний кординат D рассчитывается по прямому углу B:

        bool getLastCoordinateIfRightAngle( vertex a, vertex b, vertex c, vertex & d ){
    if( isRighAngle( a, b, c ) ){
    d = (a + c) - b;
    return true;
    }
    return false;
    }
    

    Ищите правильный угол:

    Таким образом, чтобы найти последнюю координату D из 3 вершин A, B и C, вы должны выполнить тест для трех случаев прямого угла, тест останавливается, когда решение найдено:

        bool getLastCoordinate( vertex a, vertex b, vertex c, vertex &d ){
    
    if( getLastCoordinateIfRightAngle( a, b, c, d )   //if B is at the right angle
    || getLastCoordinateIfRightAngle( a, c, b, d ) //if C is at the right angle
    || getLastCoordinateIfRightAngle( b, a, c, d ) ) //if A is at the right angle
    {
    return true;
    }
    
    //No right angle found.
    return false;
    }
    

    Быстрый тест :

    Мы можем сделать быстрый тест, если он работает:

        int main(int argc, char *argv[])
    {
    vertex A(0.0, 0.0), B(1.0, 0.0), C(0.0, 1.0), D;
    
    if( getLastCoordinate( A, B, C, D ) ){
    std::cout << "D coordinate " << D << " found from inputs :  " << A << B << C << std::endl;
    }else {
    std::cout << "D coordinate not found for input:  " << A << B << C << std::endl;
    }
    
    return 0;
    }
    

    EPSILON CHOICE:

    Это зависит от вашего домена: если вы работаете в очень маленьком объектном домене, который (X, Y) очень мал (например, близок к 10E-5), у вас будут некоторые трудности в вычислениях (плавающая точка в GPU очень ограничена в точность). Лучше преобразовать рабочий домен в нормальный диапазон.
    В приведенном выше примере EPSILON установлен на 10E-6. Если длина между двумя точками меньше этого значения, эти две точки можно рассматривать как уникальную точку — они остаются в одной и той же позиции).

    1

    bsitenldefom104

    bsitenldefom104

    Вопрос по математике:

    Точки А(-3,1)В(1,1)С(1,-1) Вершины прямоугольника АВСД Найдите координаты четвертой вершины прямоугольника и вычислите его периметр и площадь,если единичный отрезок 0,5 см ПОМОГИТЕ ПОЖАЛУЙСТА!!!❤️

    Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?

    Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок – бесплатно!

    Ответы и объяснения 1

    averampey

    averampey

    Д(-3,-1)
    (2+1)•2=6см периметр
    2•1=2см/кв площадь

    Знаете ответ? Поделитесь им!

    Гость

    Гость ?

    Как написать хороший ответ?

    Как написать хороший ответ?

    Чтобы добавить хороший ответ необходимо:

    • Отвечать достоверно на те вопросы, на которые знаете
      правильный ответ;
    • Писать подробно, чтобы ответ был исчерпывающий и не
      побуждал на дополнительные вопросы к нему;
    • Писать без грамматических, орфографических и
      пунктуационных ошибок.

    Этого делать не стоит:

    • Копировать ответы со сторонних ресурсов. Хорошо ценятся
      уникальные и личные объяснения;
    • Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не
      знаю» и так далее;
    • Использовать мат – это неуважительно по отношению к
      пользователям;
    • Писать в ВЕРХНЕМ РЕГИСТРЕ.

    Есть сомнения?

    Не нашли подходящего ответа на вопрос или ответ отсутствует?
    Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие
    вопросы в разделе Математика.

    Трудности с домашними заданиями? Не стесняйтесь попросить о помощи –
    смело задавайте вопросы!

    Математика — наука о структурах, порядке и отношениях, исторически сложившаяся на основе операций подсчёта, измерения и описания формы объектов.

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