Пусть координаты центра (x0;y0), а координаты одной из вершин (х1;у1). Нужно найти неизвестные координаты трёх вершин правильного четырёхугольника, вписанного в окружность с центром (х0;у0) радиуса
r = ✓((х1-х0)²+(y1-y0)²). Координаты всех вершин выражаются через r и φ, a угловой сдвиг между ближайшими вершинами равен прямогу углу π/2. Для вершины с координатами (х1;у1):
(x0;y0)+r•(cos φ, sin φ) = (x1;y1).
Если х1=х0 и у1>у0, то φ=π/2.
Если х1=х0 и у1<у0, то φ=-π/2.
Во всех других случаях
φ=arctg((y1-y0)/(x1-x0)).
Логика понятна? Тогда кодируем. Вершина с известными координатами у нас выводится как первая, три другие следуют за ней обходом против часовой стрелки: #include
#include
int main()
{
double dx, dy, x0, y0, x1, y1, r, fi, Fi,
polpi = 1.57079632679489661923;
printf("x0 y0 x1 y1: ");
scanf("%lf%lf%lf%lf", &x0, &y0, &x1, &y1);
dx = x1 - x0;
dy = y1 - y0;
r = sqrt(dx * dx + dy * dy);
if (x1 == x0)
{
if (y1 > y0)
fi = polpi;
else
fi = -polpi;
}
else
fi = atan(dy / dx);
for (int k = 0; k < 4; ++k)
{
Fi = fi + k * polpi;
printf("%d) %12.6f%12.6f\n", k + 1,
x0 + r * cos(Fi), y0 + r * sin(Fi));
}
} Такой подход универсален для определения неизвестных координат вершин любых правильных n-угольников, только угловое расстояние, отсчитываемое от их центров, между вершинами будет не как в данном случае τ/4 (поскольку квадрат - это правильный четырёхугольник), а τ/n. А так как в данном случае угловое расстояние представляет из себя прямой угол, то здесь действительно можно обойтись и без тригонометрических функций.