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

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

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

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

Добавлено через 1 минуту
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2016, 14:29
Ответы с готовыми решениями:

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

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

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

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

14
104 / 104 / 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
0 / 0 / 0
Регистрация: 15.12.2017
Сообщений: 11
14.07.2018, 08:12 3
Цитата Сообщение от ThePlague Посмотреть сообщение
в чем соль вопроса?
Стороны прямоугольника не обязательно параллельны осям координат.
0
151 / 143 / 87
Регистрация: 13.06.2018
Сообщений: 625
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
218 / 196 / 39
Регистрация: 08.10.2015
Сообщений: 773
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
2662 / 1665 / 347
Регистрация: 09.09.2017
Сообщений: 6,915
15.07.2018, 09:14 6
Прямоугольник ABCD
https://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
218 / 196 / 39
Регистрация: 08.10.2015
Сообщений: 773
15.07.2018, 10:12 7
COKPOWEHEU, да, но это относится только к упорядоченной последовательности вершин.
Примените Ваш код, например к примеру выше (из#5) {A={9,5},B={2,4},C={8,2}}. Т.е. сначала надо упорядочить заданные точки, что потребует значительного количества условий типа if(x[i]>x[j]) и т.п. Возможно, может получиться и компактней, но я исходил (просто захотел) из условия использования координат точек "как есть", т.е. без какого-либо анализа их взаимного положения.
0
2662 / 1665 / 347
Регистрация: 09.09.2017
Сообщений: 6,915
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
218 / 196 / 39
Регистрация: 08.10.2015
Сообщений: 773
15.07.2018, 16:51 9
COKPOWEHEU, да Ваше решение кажется более понятным и простым. Но попробуйте довести его до реального рабочего кода - будет ли он короче? И понятнее?
0
2662 / 1665 / 347
Регистрация: 09.09.2017
Сообщений: 6,915
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
0 / 0 / 0
Регистрация: 04.09.2018
Сообщений: 21
13.10.2018, 17:35 11
COKPOWEHEU,

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

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

Добавлено через 6 минут
Другими словами почему нельзя было написать Vector2i (int x, int y)?
0
Нарушитель
4575 / 2474 / 557
Регистрация: 12.03.2015
Сообщений: 12,184
14.10.2018, 12:13 14
Для начала предлагаю таки убедиться, что заданные 3 точки действительно являются вершинами прямоугольного треугольника!
0
2662 / 1665 / 347
Регистрация: 09.09.2017
Сообщений: 6,915
14.10.2018, 13:03 15
Цитата Сообщение от afler Посмотреть сообщение
Можно еще узнать, для чего написана 6 строка и для чего в 7 {x=_x; y=_y;}
6 строка это конструктор без параметров.
x и y это поля класса, а _x, _y - аргументы конструктора, чтобы не путались друг с другом.
Цитата Сообщение от Verevkin Посмотреть сообщение
Для начала предлагаю таки убедиться, что заданные 3 точки действительно являются вершинами прямоугольного треугольника!
В смысле? Есть же эта проверка.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2018, 13:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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