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

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

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

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

Добавлено через 1 минуту

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

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

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

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

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

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

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

9
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
Сообщений: 8
14.07.2018, 08:12 #3
Цитата Сообщение от ThePlague Посмотреть сообщение
в чем соль вопроса?
Стороны прямоугольника не обязательно параллельны осям координат.
0
Biger18
113 / 113 / 76
Регистрация: 13.06.2018
Сообщений: 389
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
САлександр
44 / 45 / 7
Регистрация: 08.10.2015
Сообщений: 124
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
876 / 640 / 147
Регистрация: 09.09.2017
Сообщений: 2,781
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
САлександр
44 / 45 / 7
Регистрация: 08.10.2015
Сообщений: 124
15.07.2018, 10:12 #7
COKPOWEHEU, да, но это относится только к упорядоченной последовательности вершин.
Примените Ваш код, например к примеру выше (из#5) {A={9,5},B={2,4},C={8,2}}. Т.е. сначала надо упорядочить заданные точки, что потребует значительного количества условий типа if(x[i]>x[j]) и т.п. Возможно, может получиться и компактней, но я исходил (просто захотел) из условия использования координат точек "как есть", т.е. без какого-либо анализа их взаимного положения.
0
COKPOWEHEU
876 / 640 / 147
Регистрация: 09.09.2017
Сообщений: 2,781
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
САлександр
44 / 45 / 7
Регистрация: 08.10.2015
Сообщений: 124
15.07.2018, 16:51 #9
COKPOWEHEU, да Ваше решение кажется более понятным и простым. Но попробуйте довести его до реального рабочего кода - будет ли он короче? И понятнее?
0
COKPOWEHEU
876 / 640 / 147
Регистрация: 09.09.2017
Сообщений: 2,781
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
16.07.2018, 00:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2018, 00:43

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

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

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


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

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

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