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



Ученик

(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.”
Вот здесь вы наверно ошибаетесь. Если прямоугольник будет наклонен? Что-то типа этого)

Timon55

0 / -1 / 0

Регистрация: 25.07.2017

Сообщений: 10

1

По трём вершинам прямоугольника определить четвёртую

28.08.2017, 05:14. Показов 3518. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Есть программа,которая по заданным координатам трёх вершин определяет координаты четвертой. Я не могу понять как она работает, ну то есть сам алгоритм нахождения координат четвертой вершины. Подскажите кому не трудно. Заранее благодарен.

Листинг:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main;
 
import java.nio.file.Paths;
import java.util.Scanner;
import java.io.IOException;
import java.io.File;
import java.io.PrintWriter;
import java.nio.file.Path;
 
class Main {
 
    public static void main(String args[]) {
        String filename = "input.txt";
        Path path = Paths.get(filename);
        try {
            Scanner in = new Scanner(path);
            int x1, x2, x3, x4, y1, y2, y3, y4;
            x1 = in.nextInt();
            y1 = in.nextInt();
            x2 = in.nextInt();
            y2 = in.nextInt();
            x3 = in.nextInt();
            y3 = in.nextInt();
            x4 = 0;
            y4 = 0;
            if ((x2 - x1) * (x3 - x1) + (y2 - y1) * (y3 - y1) == 0) {
                x4 = x3 + x2 - x1;
                y4 = y3 + y2 - y1;
            } else if ((x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) == 0) {
                x4 = x3 + x1 - x2;
                y4 = y3 + y1 - y2;
            } else if ((x1 - x3) * (x2 - x3) + (y1 - y3) * (y2 - y3) == 0) {
                x4 = x2 + x1 - x3;
                y4 = y2 + y1 - y3;
            }
            PrintWriter out = new PrintWriter(new File("output.txt"));
            out.write("" + x4 + " " + y4);
            out.close();
        } catch (IOException e) {
            System.out.println("Ошибка чтения");
        }
    }
}



-0.50



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.08.2017, 05:14

Ответы с готовыми решениями:

Нахождение площади прямоугольника по его вершинам
Здравствуйте,
необходимо найти площадь прямоугольника по его вершинам, не могу понять в чем моя…

По трем вершинам прямоугольника найти координаты четвертой
Доброго времени суток! Помогите плз сделать эти задания на с++ в Builder XE 2

4. По известным…

По известным трем вершинам прямоугольника (x1, y1), (x2, y2), (x3, y3) найти координаты четвертой вершины
Помогите составить такую прогу на C#.

Прокомментируйте код, находящий 4-ю вершину прямоугольника по трём заданным
объясните пожалуйста программу,каждую строчку,ничего не понимаю(
Пусть даны координаты трех вершин…

3

Эксперт Java

3638 / 2970 / 918

Регистрация: 05.07.2013

Сообщений: 14,220

28.08.2017, 08:23

2

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



0



164 / 170 / 139

Регистрация: 28.11.2016

Сообщений: 301

28.08.2017, 09:03

3

Лучший ответ Сообщение было отмечено Timon55 как решение

Решение

Условие (x3-x2)*(x2-x1)+(y3-y2)*(y2-y1) = 0 это условие перпендикулярности векторов.
http://www.cleverstudents.ru/v… arity.html
То есть если три точки образуют два вектора с прямым углом, то из крайней точки строится
вектор перпендикулярный тому что входит, так чтобы получился зигзаг.
Смотрите картинку.

Миниатюры

По трём вершинам прямоугольника определить четвёртую
 



1



0 / -1 / 0

Регистрация: 25.07.2017

Сообщений: 10

28.08.2017, 09:15

 [ТС]

4

Xoraxax, спасибо за помощь

Добавлено через 2 минуты
v777779, спасибо вы дали исчерпывающий ответ. Как я мог не узнать скалярное произведение ума не приложу. Всю голову изломал думаю же что-то знакомое.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

28.08.2017, 09:15

Помогаю со студенческими работами здесь

Определить, где находится текущая точка: внутри прямоугольника, снаружи, на границе прямоугольника
Представьте, что у вас на форме есть прямоугольник, границы которого на 10 пикселей отстоят от…

По заданным вершинам определить фигуру
квадрат, прямоугольник, параллелограмм, трапеция или ромб. Необходимо написать консольное…

Определить, какой из треугольников, построенных по заданным вершинам, имеет наибольшую площадь
Сегодня в институте дали задание по дисциплине "Информатика и программирование" но к нашему же…

Определить, сколько чисел кратно трём
Имеется 3 целых числа. Определить, сколько среди них кратных 3

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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

    arsen16041981

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

    uses crt,graphABC;
    var x1,y1,x2,y2,x3,y3,x4,y4,k:integer;
        x11,y11,x12,y12,x13,y13:integer;//для построения прямоугольника
        s1,s2:string;
    begin
    clrscr;
    repeat
    writeln('Введите координаты 3х вершин прямоугольника от 100 до 450:');
    readln(x1,y1,x2,y2,x3,y3); //чтобы 4-я вершина вошла на экран
    until(x1>=100)and(x1<=400)and(y1>=100)and(y1<=400)
    and (x2>=100)and(x2<=400)and(y2>=100)and(y2<=400)
    and(x3>=100)and(x3<=400)and(y3>=100)and(y3<=400);
    k:=0;
    //если первая точка вершина прямого угла
    if (x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)=0 then
     begin
      x4:=x3+x2-x1; y4:=y3+y2-y1;//координаты 4 точки
      x11:=x1; y11:=y1;//координаты 3-х вершин прямоугольника
      x12:=x2; y12:=y2;
      x13:=x3;y13:=y3;
     end
    //если вторая
    else if (x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0 then
     begin
      x4:=x3+x1-x2; y4:=y3+y1-y2;
      x11:=x2; y11:=y2;
      x12:=x1; y12:=y1;
      x13:=x3;y13:=y3;
     end
    //если третья
    else if (x1-x3)*(x2-x3)+(y1-y3)*(y2-y3)=0 then
     begin
      x4:=x2+x1-x3;  y4:=y2+y1-y3;
      x11:=x3; y11:=y3;
      x12:=x2; y12:=y2;
      x13:=x1;y13:=y1;
     end
    //если нет прямого угла
    else k:=1;
    hidecursor;
    setwindowsize(500,500);
    clearwindow;
    //рисуем 3 вершины
    setbrushcolor(clBlue);
    circle(x1,y1,3);
    circle(x2,y2,3);
    circle(x3,y3,3);
    //выводим координаты
    setbrushstyle(bsClear);
    setfontcolor(clBlue);
    str(x1,s1);
    str(y1,s2);
    textout(x1+10,y1,'1-('+s1+','+s2+')');
    str(x2,s1);
    str(y2,s2);
    textout(x2+10,y2,'2-('+s1+','+s2+')');
    str(x3,s1);
    str(y3,s2);
    textout(x3+10,y3,'3-('+s1+','+s2+')');
    if k=1 then //если не прямоугольник
     begin
      setbrushstyle(bsClear); //выводим сообщение
      setfontcolor(clBlack);
      textout(0,0,'Данные точки не вершины прямоугольника');
     end
    else //прямоугольник
     begin
      setbrushcolor(clRed); //4 точка
      circle(x4,y4,3);
      str(x4,s1);
      str(y4,s2);
      setbrushstyle(bsClear);
      setfontcolor(clRed);
      textout(x4+10,y4,'4-('+s1+','+s2+')');//координаты
      setpencolor(clBlue);
      moveto(x11,y11);
      lineto(x12,y12);
      lineto(x4,y4);
      lineto(x13,y13);
      lineto(x11,y11);
      setfontcolor(clBlack);//сообщение
      textout(100,10,'Координаты четвертой вершины '+s1+'  '+s2)
     end;
     
    end.

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