Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Нужно построить вектора и их суммарный вектор


Автор: Гость_Mad 20.10.2004, 16:19
Задаётся длинна и угол

Автор: p0s0l 20.10.2004, 16:38
В чём: в паскале или Delphi ?

Автор: Гость_Mad 20.10.2004, 16:51
В Delphi

Автор: Гость_Mad 20.10.2004, 16:58
Желательно с использованием компонента TChart :stena

Автор: p0s0l 20.10.2004, 17:49
Вытаскиваешь на форму TChart, два раза кликаешь по нему, в закладке "Series" жмешь Add, выбираешь "Arrow".
Опиши вырисовываемые вектора:
Код
type
 TVector = record
   Len, Angle : real;
 end;

var Vectors : array [0..5] of TVector =
 ( (Len : 5; Angle : pi/3),
   (Len : 6; Angle : 0.01),
   (Len : 3; Angle : pi/2),
   (Len : 4; Angle : pi/4),
   (Len : 5; Angle : 0.5),
   (Len : 8; Angle : pi/2) );

И на кнопку, к примеру, повесь обрабочик:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
 x, y, x1, y1 : real;
 i : integer;

begin
 x := 0;
 y := 0;

 Series1.Clear;
 for i := Low(Vectors) to High(Vectors) do
 with Vectors[i] do
 begin
   x1 := x + cos(Angle)*Len;
   y1 := y + sin(Angle)*Len;
   Series1.AddArrow(x, y, x1, y1, '', clRed);
   x := x1;
   y := y1;
 end;
 Series1.AddArrow(0, 0, x, y, '', clGreen);

 Chart1.ClipPoints := False;
end;


Автор: Spanishmad 20.10.2004, 18:09
Спасибо!
Я конечно не профи в Delphi, но не будет такой же проблемы как и у меня, он строит вектор с нормальным углом (от 1 до 89) тоолько в 1 четверти и если задать другой угол то он строит не понять где и почему (не логично). :qstn

Автор: p0s0l 20.10.2004, 19:09
Да вроде не должно быть такого...
Только учти, что в sin и cos углы - в радианах.
Если хочешь, чтобы в Vectors указывались не радианы, а градусы, то эти 2 строчки измени так:
Код
   x1 := x + cos(Angle*pi/180)*Len;
   y1 := y + sin(Angle*pi/180)*Len;

Автор: Spanishmad 20.10.2004, 20:13
Да, вроде и не должно быть, но есть я там уже вроде всё просмотрел. А начал заново с твоей помощью и вроде нормально строит, а туда вставляю есть :stena . А радианы в градусы я перевожу с помощью DegtoRad. //Angle:= DegtoRad (Angle);
Только ты не могбы подсказать как мне сделать чтоб не против часовой угол откладывался (это вроде называется толи матрица поворота толи просто поворот)

Автор: p0s0l 20.10.2004, 20:51
Просто смени знак у угла:
Angle := DegtoRad (-Angle);

Автор: Spanishmad 20.10.2004, 21:18
Спасибо :)
Вроде пока всё работает.
А как лучше сделать так чтобы каждый вектор бал подписан(ну тип 1,2,3... и т.д.)
Может с помощью Canvas что-нибудь придумать.

Автор: p0s0l 20.10.2004, 22:12
В цикле поменяй строчку:
Код
  Series1.AddArrow(x, y, x1, y1, IntToStr(i), clRed);

И в конце или в начале процедуры добавь:
Код
 Series1.Marks.Visible := True;
 Series1.Marks.Transparent := False;
Transparent = False стоит т.к. если 3D стиль отключен, то прозрачность не работает... Поэтому если у тебя много векторов, то будет легче включить 3D стиль (два раза кликни по TChart, выбери закладку 3D), и сделать 1% в графе "3D", и поставить галочку Orthogonal. Тогда Series1.Marks.Transparent делай True.
Цвет и шрифт подписей - это Series1.Font.Color к примеру. Но лучше два раза опять тыкни по TChart, зайди в закладку Series, внутри неё выбери закладку "Marks" и там поиграйся как будет красивее...

Автор: Spanishmad 20.10.2004, 22:59
:) Благодарю за помощь !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)