Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Вниз

Геометрия. Как повернуть отрезок на заданный угол?   Найти похожие ветки 

 
SPeller   (2002-07-03 09:34) [0]

Всем привет! Чего-то я сам доехоть не могу, как повернуть отрезок на заданный угол, если известны координаты начала и конца отрезка. Делал-делал сам, но чего-то ещё не хватает. Помогите пожалуйста.


 
MBo   (2002-07-03 09:51) [1]

относительно начала?


 
Kaban   (2002-07-03 09:58) [2]

Почему всегда лень в Интернете поискать. Поиск на рамблере по ключевым словам "поворот вектора". Это первый документ, в котором говорится о Декартовой системе координат:
http://faqs.org.ru/progr/graph/ddesign5.htm



 
Johnmen   (2002-07-03 09:58) [3]

В смысле найти координаты концов после поворота ?


 
Виктор Щербаков   (2002-07-03 09:59) [4]

Пусть С - точка, отн. которой нужно повернуть отрезок.
AB - сам отрезок.
Найди уравнения окружностей с центрами в С и радиусами CA и CB в виде:
x = R cos t,
y = R sin t.
Найди угол между осью абсцисс и прямой, которой принадлежат точки A и B. Прибавь к нему угол, на который нужно повернуть отрезок. Подставь этот угол в найденные тобой уравнения окружностей, иполучишь координаты повернутого отрезка.


 
Alx2   (2002-07-03 10:00) [5]

Поворот вокруг начала координат:
alpha - угол поворота.
xn = -sin(alpha)*y+cos(alpha)*x;
yn = cos(alpha)*y+sin(alpha)*x;


 
Alx2   (2002-07-03 10:01) [6]

Если вокруг произвольной точки (x0,y0), то, кажется, так:
xn = -sin(alpha)*(y-y0)+cos(alpha)*(x-x0)+x0;
yn = cos(alpha)*(y-y0)+sin(alpha)*(x-x0)+y0;


 
SPeller   (2002-07-03 10:21) [7]

Извиняюсь что сразу не уточнил - поворот относительно начала отрезка.


 
Виктор Щербаков   (2002-07-03 10:25) [8]

Дык тебе ж фактически поворот точки нужен был.
Так что берешь формулы Alx2 © (03.07.02 10:01), и вперед.


 
SPeller   (2002-07-03 10:26) [9]

И ещё вопрос: как найти угол между двумя отрезками по известным координатам отрезков. Отрезки начинаются в одной точке.


 
Alx2   (2002-07-03 10:29) [10]

cos(alpha)=(a,b)/(|a||b|)
a и b - вектора.
(a,b) - скалярное произведение.
|a| - модуль вектора.


 
RV   (2002-07-03 10:29) [11]

возми геометрию за 8-9-10 классы
можть другое что увидишь и проще сделаешь


 
Alx2   (2002-07-03 10:31) [12]

Или в "разжеванном" виде:
alpha = arccos(((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3))/(sqrt((x2-x1)^2+(y2-y1)^2)*sqrt((x4-x3)^2+(y4-y3)^2)))
Где первый отрезок имеет координаты [x1,y1],[x2,y2].
Второй отрезок имеет координаты [x3,y3],[x4,y4]


 
SPeller   (2002-07-03 10:31) [13]

2 RV © (03.07.02 10:29)

Предлагаешь в школу за ними идти? Откда у меня такие книги? :)


 
SPeller   (2002-07-03 10:33) [14]

2 Alx2 © (03.07.02 10:31)

Разжёвывать мне не надо, у самого зубы есть...


 
Alx2   (2002-07-03 10:34) [15]

>SPeller © (03.07.02 10:33)
Тогда почему не жуем? :)


 
Виктор Щербаков   (2002-07-03 10:54) [16]

SPeller ©
Курс аналитической геометрии (или похожий) не читали тебе?
В анкете-то написано "незаконченное высшее". Или ты на гуманитарной специальности?


 
SPeller   (2002-07-03 11:16) [17]

2 Виктор Щербаков © (03.07.02 10:54)

Это же не значит что я должен помнить весь курс аналитической геометрии полностью весь. Я вам не жесткий диск, куда записал и никуда оно не денется.


 
Виктор Щербаков   (2002-07-03 11:32) [18]

SPeller © (03.07.02 11:16)
Конечно помнить весь курс не должен, но должен знать где найти нужную информацию.
Я вот, к примеру, тоже не помню этих формул, но знаю, что изучались такие вещи в курсе ангема. После чего, найти их в книжке или в сети - не более 3-х минут.


 
Alx2   (2002-07-03 12:10) [19]

>SPeller © (03.07.02 10:33)
Да, и откуда мне знать что ты помнишь формулы скалярного произведения и модуля?
Посему и пожевал...


 
SPeller   (2002-07-03 12:23) [20]

2 Alx2

А формулы твои не работают.
Вот как надо (слава богу дошло до меня):

xn:=cos(angle/180*3.14)*l+pos.X1;
yn:=sin(angle/180*3.14)*l+pos.Y1; где l - длина отрезка.

Это поворот относительно оси Х на угол angle.


 
Виктор Щербаков   (2002-07-03 12:35) [21]


> Это поворот относительно оси Х на угол angle.

Поворот (на плоскости) бывает относительно точки.
А формулы работают.


 
SPeller   (2002-07-03 12:52) [22]

2 Виктор Щербаков © (03.07.02 12:35)

> А формулы работают.

Попробуйте поставить тогда такую запись (взята у Alx2) и проверьте на практике, что из этого получится.

xn:=cos(angle/180*3.14)*X2+X1;
yn:=sin(angle/180*3.14)*X2+Y1;

y=y0=0 , т.к. поворачиваем относительно Х

> Поворот (на плоскости) бывает относительно точки.

Я себе не представляю как можно повернуть прямую относительно точки. Для этого необходимо как минимум соединить её с одной из точек прямой и определять угол между ними.


 
SPeller   (2002-07-03 13:01) [23]

Вломы самим писать, можете посмотреть тут что вырисовывают эти формулы:
http://spellersoft.narod.ru/sin.jpg


 
Виктор Щербаков   (2002-07-03 13:09) [24]


> Я себе не представляю как можно повернуть прямую относительно
> точки.

Речь шла об отрезках, но это не важно.
Когда ты катаешься на карусели, то твоя проекция на плоскость (допустим такое приближение) земной поверхности вращается относительно проекции центра карусели на ту же плоскость. Т.е. относительно точки. Что тут непонятного?

SPeller © (03.07.02 13:01)
И типа из этого следует, что тебе дали неверные формулы, а ты их правильно применил и написал правильный код.


 
Alx2   (2002-07-03 13:12) [25]

>SPeller © (03.07.02 12:52)
:)
Ну так углы-то в радианах задаются, до чего ты и догадался.
Кстати, будешь считать arccos, не забудь, что он тоже в радианах считается. А то, что ты написал - получается после подстановки соответствующих значений.
PS
А формулы эти стандартные.


 
SPeller   (2002-07-03 14:28) [26]

2 Alx2 © (03.07.02 13:12)

> Ну так углы-то в радианах задаются, до чего ты и догадался.
Без разницы. Я задаю angle в градусах, а программно уже перевожу в радианы. Это я знаю уже давно. А ты бы взял да попробовал применить свои формулы и с ними нарисовать круг проходя от 0 до 360 градусов или от 0 до 6,28 радиан.

> Кстати, будешь считать arccos, не забудь, что он тоже в радианах считается
Да ну?!

2 Виктор Щербаков © (03.07.02 13:09)

> И типа из этого следует, что тебе дали неверные формулы, а ты их правильно применил и написал правильный код.
Нет, типа...


 
Alx2   (2002-07-03 14:50) [27]

>SPeller © (03.07.02 14:28)
Попробовал. Все рисует.
На Timer вешаю интервал 10 ms.
переменные x и y - поля Form3
За каждый шаг точка поворачивается на 10 градусов.

Var counter : boolean = false;
procedure TForm3.Timer1Timer(Sender: TObject);
Var xn,yn,x0,y0,alpha : double;
begin
y0 := Height/2;
x0 := Width /2;
alpha := 10*Pi/180;
xn := -sin(alpha)*(y-y0)+cos(alpha)*(x-x0)+x0;
yn := cos(alpha)*(y-y0)+sin(alpha)*(x-x0)+y0;
if counter then
canvas.Pixels[round(xn),round(yn)]:= clWhite
else
canvas.Pixels[round(xn),round(yn)]:= clBlack;
counter := not counter;
x := xn;
y := yn;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
y := Height / 2 + 10;
x := Width / 2 + 10;
end;



 
Alx2   (2002-07-03 14:58) [28]

А вот с отрезком:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm3 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
x1,y1, x2,y2 : double;
end;

var
Form3: TForm3;

implementation

{$R *.dfm}
procedure Rotate(Var x,y : double; x0, y0, alpha : double);
Var xn, yn : double;
begin
xn := -sin(alpha)*(y-y0)+cos(alpha)*(x-x0)+x0;
yn := cos(alpha)*(y-y0)+sin(alpha)*(x-x0)+y0;
x := xn;
y := yn;
end;


Var counter : boolean = false;
procedure TForm3.Timer1Timer(Sender: TObject);
Var x0, y0 : Double;
begin
y0 := Height/2;
x0 := Width /2;
Canvas.Pen.Color := Color;
Canvas.MoveTo(round(x1),round(y1));
Canvas.LineTo(round(x2),round(y2));
Rotate(x1,y1,x0,y0,10*Pi/180);
Rotate(x2,y2,x0,y0,10*Pi/180);
Canvas.Pen.Color := clBlack;
Canvas.MoveTo(round(x1),round(y1));
Canvas.LineTo(round(x2),round(y2));
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
x1 := Width / 2 + 10;
y1 := Height / 2 + 10;
x2 := x1 + 20;
y2 := y1 + 20;
end;

end.


 
SPeller   (2002-07-03 15:14) [29]

Ну тогда хрен знает..... Но всё равно спасибо


 
Alx2   (2002-07-03 16:00) [30]

:)
Скорее всего, где-то напортачил немного...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
3-95249
Prog_mail
2002-07-09 11:25
2002.07.29
Помогите с DBGrid.


4-95595
Voland!
2002-05-21 02:16
2002.07.29
Mouse


14-95554
MetalFan
2002-07-03 12:08
2002.07.29
Что за файл?


1-95424
Руль
2002-07-15 19:11
2002.07.29
Автоматический запуск Excel


3-95243
Dush
2002-07-08 15:44
2002.07.29
Сортировка с украинскими буквами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский