Найдите координаты точек B и D квадрата - C (СИ)
Формулировка задачи:
У квадрата ABCD, расположенного на плоскости, произвольно известны координаты двух противоположных вершин, точек А и С. Найдите координаты точек B и D.
Расположение квадрата произвольно, его стороны не обязательно параллельны координатным осям
Решение задачи: «Найдите координаты точек B и D квадрата»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct _Point
{
double X;
double Y;
} Point;
Point MakePoint(double x, double y) { Point p; p.X = x; p.Y = y; return p; }
typedef struct _Vector
{
double X;
double Y;
} Vector;
Vector MakeVector(double x, double y) { Vector p; p.X = x; p.Y = y; return p; }
Vector MakeVector(Point begin, Point end) { Vector p; p.X = end.X - begin.X; p.Y = end.Y - begin.Y; return p; }
double Dist(Vector v) { return sqrt(v.X * v.X + v.Y * v.Y); }
void ToOne(Vector* v) { double d = Dist(*v); v->X /= d; v->Y /= d; }
void Mul(Vector* v, double d) { v->X *= d; v->Y *= d; }
typedef struct _Line
{
double A;
double B;
double C;
} Line;
Line MakeLine(Point p1, Point p2)
{
Line l;
double x1 = p1.X, y1 = p1.Y, x2 = p2.X, y2 = p2.Y;
double dx = x2 - x1;
double dy = y2 - y1;
l.A = dy;
l.B = dx * (-1.0);
l.C = dx * y1 - dy * x1;
return l;
}
int main()
{
double ax, ay, cx, cy;
scanf("%lf", &ax);
scanf("%lf", &ay);
scanf("%lf", &cx);
scanf("%lf", &cy);
Point A = MakePoint(ax, ay);
Point C = MakePoint(cx, cy);
Line AC = MakeLine(A, C);
Point middle = MakePoint((ax + cx) * 0.5, (cy + ay) * 0.5);
Vector ma = MakeVector(middle, A);
Vector lv = MakeVector(AC.A, AC.B);
ToOne(&lv);
Mul(&lv, Dist(ma));
Point B = MakePoint(middle.X - lv.X, middle.Y - lv.Y);
Point D = MakePoint(middle.X + lv.X, middle.Y + lv.Y);
printf("B = (%lf %lf)\n", B.X, B.Y);
printf("D = (%lf %lf)\n", D.X, D.Y);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем структуры для представления точек, векторов и линий
- Определяем функции для работы с точками, векторами и линиями
- В функции main() считываем координаты точек A и C
- Создаем объект Line AC, представляющий отрезок между точками A и C
- Находим середину отрезка AC и создаем объект Point middle
- Создаем вектор ma, направленный от точки middle к точке A
- Создаем вектор lv, равный вектору ma, умноженному на длину отрезка AC
- Переносим координаты точки B на экран
- Переносим координаты точки D на экран
- Возвращаем 0, чтобы указать, что программа успешно завершилась