Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
wqe
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 2
1

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

27.01.2016, 14:29. Просмотров 895. Ответов 14
Метки нет (Все метки)

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

Добавлено через 1 минуту
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2016, 14:29
Ответы с готовыми решениями:

Определить координаты четвертой вершины прямоугольника
Пусть даны координаты трех вершин прямоугольника. Определите координаты...

Найти координаты четвертой вершины прямоугольника
Даны целочисленные координаты трех вершин прямоугольника, стороны которого...

Найти координаты четвертой вершины прямоугольника
Заданы координаты трех вершин прямоугольника. Необходимо определить координаты...

Вычислить координаты четвертой вершины прямоугольника
Даны числа x1, y1, x2, y2, x3, y3 – координаты трёх каких-то вершин...

Найти координаты четвертой вершины прямоугольника
У меня задание такое: Даны целочисленные координаты трех вершин...

14
ThePlague
102 / 102 / 99
Регистрация: 30.06.2015
Сообщений: 272
27.01.2016, 14:42 2
wqe, ну если допустим координаты такие: a(1,1) b(1,5), c(10,1) получается что координаты последней вершины будут d(10,5)

просто берется значение "х" вершины "с" и значение "y" вершины "b"

в чем соль вопроса?
0
Pasha04
0 / 0 / 0
Регистрация: 15.12.2017
Сообщений: 11
14.07.2018, 08:12 3
Цитата Сообщение от ThePlague Посмотреть сообщение
в чем соль вопроса?
Стороны прямоугольника не обязательно параллельны осям координат.
0
Biger18
145 / 139 / 85
Регистрация: 13.06.2018
Сообщений: 550
14.07.2018, 09:08 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    double d[][2]={{3,8},{9,5},{7,1}};//в любом,но в порядке обхода
    double x,y;
    if(d[0][1]==d[1][1])
    {
        x=d[0][0];
        y=d[2][1];
    }
    else
    {
        double a1=(d[0][1]-d[1][1])/(d[0][0]-d[1][0]);
        double b1=d[2][1]-a1*d[2][0];
        double a2=(d[1][1]-d[2][1])/(d[1][0]-d[2][0]);
        double b2=d[0][1]-a2*d[0][0];
        x=(b2-b1)/(a1-a2);
        y=a1*x+b1;
    }
    cout<<x<<" "<<y<<endl;
.... мда, тема то свежак
0
САлександр
77 / 72 / 16
Регистрация: 08.10.2015
Сообщений: 212
15.07.2018, 03:55 5
Проверку на параллельность осям делать не стал (это нужно, чтобы не делить на 0, но поленился, оптимизацией также не увлекался). Порядок обхода не задается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    double d[][2]={{9,5},{2,4},{8,2}};
    double x0,x1,x2,y0,y1,y2,a0,a1,a2,X,Y,eps=1e-10;
    bool FL=0;
  
   x0=d[0][0]-d[1][0];  y0=d[0][1]-d[1][1];
   x1=d[1][0]-d[2][0];  y1=d[1][1]-d[2][1];
   x2=d[2][0]-d[0][0];  y2=d[2][1]-d[0][1];
   a0=y0/x0;   a1=y1/x1;   a2=y2/x2;
   if(fabs(a0*a1+1)<eps) {X=d[0][0]-x1; Y=d[0][1]-y1;}
     else if(fabs(a0*a2+1)<eps) {X=d[2][0]-x0; Y=d[2][1]-y0;}
      else if(fabs(a1*a2+1)<eps) {X=d[1][0]-x2; Y=d[1][1]-y2;}
        else { cout<<" Не правильно заданы точки (не могут являться вершинами прямоугольника)"<<endl; FL=1;}
  if(!FL) cout<<X<<","<<Y<<endl;
  }
system("pause");
0
COKPOWEHEU
1042 / 726 / 170
Регистрация: 09.09.2017
Сообщений: 3,210
15.07.2018, 09:14 6
Прямоугольник ABCD
http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{AB} = \vec{DC} \\\vec{BC} = \vec{AD}
Откуда
D = C+(A-B)
Ну или в координатах
C
1
2
3
D.x = C.x + A.x - B.x;
D.y = C.y + A.y - B.y;
D.z = C.z + A.z - B.z;
0
САлександр
77 / 72 / 16
Регистрация: 08.10.2015
Сообщений: 212
15.07.2018, 10:12 7
COKPOWEHEU, да, но это относится только к упорядоченной последовательности вершин.
Примените Ваш код, например к примеру выше (из#5) {A={9,5},B={2,4},C={8,2}}. Т.е. сначала надо упорядочить заданные точки, что потребует значительного количества условий типа if(x[i]>x[j]) и т.п. Возможно, может получиться и компактней, но я исходил (просто захотел) из условия использования координат точек "как есть", т.е. без какого-либо анализа их взаимного положения.
0
COKPOWEHEU
1042 / 726 / 170
Регистрация: 09.09.2017
Сообщений: 3,210
15.07.2018, 15:36 8
Хорошо, можно и с дополнительными условиями.
C
1
2
3
4
5
6
ab = B-A;
ac = C-A;
bc = C-B;
if( ab*ac == 0 ) D = C + ab; //прямой угол A
  else if( ab*bc == 0 ) D = C - ab; //прямой угол B
  else D = A - bc; //прямой угол C
При желании можно развернуть работу с векторами в отдельные переменные, добавить проверку на 0 для дробных чисел, проверки и прочее.
В худшем случае код занимает 9 сложений (вычитаний) и 4 умножения
---
Если хочется добавить проверку корректности входных данных, добавится 1 сложение и 2 умножения
1
САлександр
77 / 72 / 16
Регистрация: 08.10.2015
Сообщений: 212
15.07.2018, 16:51 9
COKPOWEHEU, да Ваше решение кажется более понятным и простым. Но попробуйте довести его до реального рабочего кода - будет ли он короче? И понятнее?
0
COKPOWEHEU
1042 / 726 / 170
Регистрация: 09.09.2017
Сообщений: 3,210
16.07.2018, 00:43 10
А чего там доводить-то?
Если писать по-человечески, то короче код не будет, из-за реализации двумерного вектора со скалярным произведением.
Собственно код нахождения четвертой точки не изменится, так что наглядность не пострадает
C++
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
#include <stdio.h>
 
class Vector2i{
public:
  int x,y;
  Vector2i(){}
  Vector2i(int _x, int _y){x=_x; y=_y;}
  Vector2i operator + (Vector2i v){Vector2i temp(x+v.x, y+v.y); return temp;}
  Vector2i operator - (Vector2i v){Vector2i temp(x-v.x, y-v.y); return temp;}
  int operator * (Vector2i v){return x*v.x + y*v.y;}
};
 
int main(){
  Vector2i a,b,c,d;
  printf("Input a(x,y), b(x,y), c(x,y)\n");
  scanf("%i%i", &a.x, &a.y);
  scanf("%i%i", &b.x, &b.y);
  scanf("%i%i", &c.x, &c.y);
  
  Vector2i ab = b-a;
  Vector2i ac = c-a;
  Vector2i bc = c-b;
  //скалярное произведение перпендикулярных векторов равно нулю. Таким способом ищем прямой угол
  if( ab*ac == 0 ) d = c+ab; //прямой угол A
    else if( ab*bc == 0 ) d = c-ab; //прямой угол B
    else if( ac*bc == 0 ) d = a-bc; //прямой угол C
    else {printf("Wrong input data\n"); return -1;} //прямых углов нет
  printf("%i %i\n", d.x, d.y);
}
Добавлено через 1 минуту
Нет, можно было, конечно, расписать по отдельным координатам, но с векторами оно нагляднее.
0
afler
0 / 0 / 0
Регистрация: 04.09.2018
Сообщений: 6
13.10.2018, 17:35 11
COKPOWEHEU,

Спасибо за код!
С классами знаком от слова никак, прямо сейчас смотрю что это такое и с чем едят, понял что вы ввели класс вектора в плоскости с соответствующими координатами (x,y) и описали операции +/-/* для векторов
Объясните пожалуйста почему 10 строка по синтаксису отличается от 8 и 9
0
COKPOWEHEU
1042 / 726 / 170
Регистрация: 09.09.2017
Сообщений: 3,210
14.10.2018, 00:24 12
Вы имеете в виду почему возвращаемое значение у операторов сложения и вычитания имеют тип Vector2i, а у умножения (скалярного) - int?
1
afler
0 / 0 / 0
Регистрация: 04.09.2018
Сообщений: 6
14.10.2018, 10:59 13
COKPOWEHEU,

Когда вы так ответили, то я понял что с точки зрения математики всё логично
С операциями понятно
Можно еще узнать, для чего написана 6 строка и для чего в 7 {x=_x; y=_y;}

Добавлено через 6 минут
Другими словами почему нельзя было написать Vector2i (int x, int y)?
0
Verevkin
1026 / 546 / 138
Регистрация: 12.03.2015
Сообщений: 3,691
14.10.2018, 12:13 14
Для начала предлагаю таки убедиться, что заданные 3 точки действительно являются вершинами прямоугольного треугольника!
0
COKPOWEHEU
1042 / 726 / 170
Регистрация: 09.09.2017
Сообщений: 3,210
14.10.2018, 13:03 15
Цитата Сообщение от afler Посмотреть сообщение
Можно еще узнать, для чего написана 6 строка и для чего в 7 {x=_x; y=_y;}
6 строка это конструктор без параметров.
x и y это поля класса, а _x, _y - аргументы конструктора, чтобы не путались друг с другом.
Цитата Сообщение от Verevkin Посмотреть сообщение
Для начала предлагаю таки убедиться, что заданные 3 точки действительно являются вершинами прямоугольного треугольника!
В смысле? Есть же эта проверка.
1
14.10.2018, 13:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2018, 13:03

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

Заданы координаты вершин двух прямоугольников. Определить их взаимное расположение
Заданы координаты вершин двух прямоугольников. Определить их взаимное...

Найти координаты четвертой вершины параллелограмма
Привет всем. Вот задали совсем простенькую задачку: Известно, что точки с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru