tankto
@tankto
люблю учиться

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

Нашел длину сторон и сравниваю их, теперь пишу код на расчет суммы углов прилежащей к одной стороне(=180гр.).
Хотелось бы еще посоветоваться на дополнительные проверки, заранее извиняюсь за плохие знания геометрии
#include <stdio.h>
#include <math.h>
#include <locale.h>

struct point_data {
	float x;
	float y;
};

int main()
{	
	struct point_data point[4];

	point[0].x = 0;
	point[0].y = 0;
	
	point[1].x = 4;
	point[1].y = 3;
	
	point[2].x = 4;
	point[2].y = 2;
	
	point[3].x = 3;
	point[3].y = 0;
	
	float a, b, c, d;
	
	a = sqrt(pow(point[1].x - point[0].x, 2) + pow(point[1].y - point[0].y, 2));
	b = sqrt(pow(point[2].x - point[1].x, 2) + pow(point[2].y - point[1].y, 2));
	c = sqrt(pow(point[3].x - point[2].x, 2) + pow(point[3].y - point[2].y, 2));
	d = sqrt(pow(point[0].x - point[3].x, 2) + pow(point[0].y - point[3].y, 2));
        //Пока что только один угол
        float lp = point[0].x * point[1].x + point[0].y * point[1].y;
	a = sqrt(pow(point[0].x, 2) + pow(point[0].y, 2));
	b = sqrt(pow(point[1].x, 2) + pow(point[1].y, 2));
	printf("%f", lp/(a*b));
  • Вопрос задан
  • 3397 просмотров
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Надежнее всего посмотреть пары сторон на параллельность.

То есть, если у вас просто 4 точки, в произвольном порядке, вы берете все пары пар и проверяете, есть ли среди них параллельные прямые.

Для проверки на параллельность нужно
1) найти направляющие векторы каждой стороны (из координат конца вычесть координаты начала)
2) нормировать эти векторы (разделить каждую из координат на длину)
3) сравнить покоординатно полученные пары. Если координаты близки, значит, данные стороны параллельны.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Ну разумеется, по критерию параллелограмма: диагонали пересекаются и точкой пересечения делятся пополам! На языке математики:
x1 + x3 ≈ x2 + x4
y1 + y3 ≈ y2 + y4
Почему «приблизительно равно». Float в принципе неточный, совпадение приходится проверять с точностью в какой-то эпсилон. Какой эпсилон — это уже зависит от задачи.
Ответ написан
Комментировать
@pestilent
Если точки должны образовать параллелограмм именно в таком порядке, в каком они даны (например, A, B, C, D) и допускается вырожденный параллелограмм, просто сравнить векторы AB и DC. Чтобы исключить вырожденный случай, проверяем векторы соседних сторон на пропорциональность. Если вершины могут идти в любом порядке, нужен небольшой перебор вариантов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 18:16
1000 руб./за проект
28 мар. 2024, в 18:15
90000 руб./за проект
28 мар. 2024, в 18:05
5000 руб./за проект