LINUX.ORG.RU

Простая задачка: помогите закончить


0

0

//------------------------------------------------------------------------------

// Задача 1.15
//
// "Косой" квадрат. У квадрата ABCD на плоскости известны координаты двух
// противоположных вершин - точек A, C.
//	
// Задание: Найти координаты точек B и D
//------------------------------------------------------------------------------

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main(int argc, char *argv[])
{
	const float A[2] = {-1, 1};
	const float C[2] = {2, 2};
	float B[2],D[2];
	
	enum{x,y};
	
	//Находим диагональ квадрата
	float AClen = sqrt(pow(C[y]-A[y], 2) + pow(C[x]-A[x], 2));

	//Находим сторону квардрата
	float a = sin(45.0 * M_PI/180) * AClen;
	
	//Находим угловой коэффициент прямой AClen
	float k1 = (C[y] - A[y]) / (C[x] - A[x]);

	//Находим угловой коэффициент прямой AB
	//В итоге из уравнения (tan45=1) получаем: k2-k1*k2=1+k1
	float k2 = (1+k1) / (float)(1.0 - k1);
	
	cout << "B: " << B[0] << "," << B[1] << endl;
	cout << "D: " << D[0] << "," << D[1] << endl;
	return 0;
}


Нашёл:
Длину AC
Сторону квадрата
Угловой коэффициент прямой AC
Угловой коэффициент прямой AB

Застопорился... С математикой туговато. Уже долго искал следующий шаг - не найти.
★★★★

А ничего, что у тебя будет floating point exception, в случае C_x = A_x. А вообще, RTFM по основам аналитической геометрии, в частности прочитать что такое скалярное произведение ;)

human0id ★★★
()
Ответ на: комментарий от human0id

>А ничего, что у тебя будет floating point exception, в случае C_x = A_x

Не будет

>в частности прочитать что такое скалярное произведение ;)

Спасибо и за это :-)

Selecter ★★★★
() автор топика

Может быть попробовать по другому. Найти точку - середину квадрата (диагонали) и относительно неё повернуть точку A в обе стороны - кажется это делается тривиально, что-то вроде | A.x - O.x | = | B.y - O.y | и наоборот. O - центр. Со знаками разобраться надо и всё.

Legioner ★★★★★
()

1. Перенести начало координат в центр отрезка АС. Запомнить вектор переноса (обозначим его r)

2. Повернуть систему координат на 90 градусов.

3. Сделать параллельный перенос на вектор -r.

4. Координаты точек A и C в полученной системе будут координтами точек B и D в данной.

Формулы преобразований декартовой плоскости (XOY -- исходная система; X'OY' -- новая) :

Параллельный перенос на вектор r (a,b)

x'=x-a

y'=y-b

Поворот на угол альфа

x'=y*sin(альфа)+x*cos(альфа)

y'=y*cos(альфа)-x*sin(альфа)

nsav-ng
()

Что-то в стиле:
O.x = |A.x + C.x | /2
O.y = |A.y + C.y | /2
B.x = O.x + (C.y - O.y)
B.y = O.y - (C.x - O.x)
D.x = O.x - (C.y - O.y)
D.y = O.y + (C.x - O.x)

io ★★
()
Ответ на: комментарий от io

Сорри, в предыдущем все скобки - круглые

io ★★
()
Ответ на: комментарий от nsav-ng

Ну мой ответ:

B.x=(y1-y2+x1+x2)/2

B.y=(x2-x1+y1+y2)/2

D.x=(y2-y1+x1+x2)/2

D.y=(x1-x2+y1+y2)/2

Получен методом, изложенным мною выше. Проверил на простеньком примере -- работает вроде.

nsav-ng
()
Ответ на: комментарий от nsav-ng

Проверил на трёх примерах. Работает даже с квадратом со сторонами параллельными осям.

Всем спасибо. Буду переваривать алгоритм.

Selecter ★★★★
() автор топика
Ответ на: комментарий от anonymous

>Как-то ты столь тривиальное решение через попу получал...

Человек просто к сложностям привык.

Selecter ★★★★
() автор топика
Ответ на: комментарий от anonymous

> Как-то ты столь тривиальное решение через попу получал...

Дорогой анонимус! Не мог бы ты доказать правильность такого решения принципиально другим методом?

nsav-ng
()

Какое скалярное произведение? Вы что комплексные числа в школе не
проходили? Центр квадрата = (A+C)/2; поворот на \pi - просто умножение на i. Поэтому (A+C)/2 + i(A - (A+C)/2) и (A+C)/2 - i(A-(A+C)/2) -
нужные вершины. Теперь раскройте скобочки и подставьте обычные
координаты aka мнимые и вещественные части.

grob ★★★★★
()

Что есть косой квадрат? Ели имеешь ввиду параллелорграм, то решений - множество.

anonymous
()
Ответ на: комментарий от grob

В школе уже давно комплексные числа не учат.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.