Написать программу на си - Компьютерные вопросы

Вопрос Написать программу на си

Регистрация
8 Май 2013
Сообщения
65
Репутация
0
Спасибо
0
Монет
0
Заданы координаты центра и одного угла квадрата, повернутого на плоскости относительно осей координат на неизвестный произвольный угол. Найти координаты остальных углов.
 
Регистрация
27 Дек 2013
Сообщения
83
Репутация
0
Спасибо
0
Монет
0
Пусть координаты центра (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. А так как в данном случае угловое расстояние представляет из себя прямой угол, то здесь действительно можно обойтись и без тригонометрических функций.
 
Регистрация
30 Окт 2013
Сообщения
93
Репутация
0
Спасибо
0
Монет
0
Если ты пишешь на С++ то ты уже не человек. Тут уже как говорится, никак не помочь...
 
Регистрация
17 Авг 2013
Сообщения
67
Репутация
0
Спасибо
0
Монет
0
надо проверять #include
#include

struct Point {
double x, y;
};

Point rotatePoint(Point center, Point corner, double theta) {
Point diff = {corner.x - center.x, corner.y - center.y};

Point rotatedDiff = {
diff.x * cos(theta) - diff.y * sin(theta),
diff.x * sin(theta) + diff.y * cos(theta)
};

Point rotatedCorner = {center.x + rotatedDiff.x, center.y + rotatedDiff.y};

return rotatedCorner;
}

int main() {
Point center = {0.0, 0.0};
Point corners[4] = {{1.0, 1.0}, {1.0, -1.0}, {-1.0, -1.0}, {-1.0, 1.0}};
double theta = M_PI / 4.0; // 45 degrees in radians

for (int i = 0; i < 4; ++i) {
Point rotatedCorner = rotatePoint(center, corners, theta);
std::cout
 
Регистрация
6 Июн 2013
Сообщения
79
Репутация
0
Спасибо
0
Монет
0
Примерно так
O(x,y), A(x1,y1)

dx=x-x1;dy=y-y1;
x2=x-dy;y2=y+dx;
x3=x+dx;y3=y+dy;
x4=x+dy;y4=y-dx;
 
Сверху Снизу