valemak
@valemak
Фрилансер

Отрезок вращается вокруг точки, которая движется по нему

Племянница попросила помочь с решением задачки на Паскале, но что-то не могу смекнуть через какие синусы это реализовать.

По отрезку длиной А от одного конца к другому равномерно движется точка. Изобразить на экране вращение этого отрезка относительно этой точки.

Кто подскажет математическую формулу, описывающую данное движение?

UPD. Огромное спасибо @OLS и @iiil, за предложенные правильные решения. Остановился на варианте с полярными координатами (просто потому что самое основное было реализовано на Паскале).

program polar_rot;

uses graphabc;

const
  WindowWidth = 600; WindowHeight = 600;
  CenterX = 300; CenterY = 300;
  PI = 3.1415926;
  Count = 2000; Len = 290;
  r = 3; PenWidth = 3;

var
  Ro : real;
  Len1, Len2 : real;
  Time : integer;
  X1, Y1, X2, Y2 : integer;

begin

  SetWindowSize(WindowWidth, WindowHeight);
  SetPenWidth(PenWidth);

  for Time := 0 to Count do
  begin
  
    Ro := Time / Count * 2 * PI;
    Len1 := Len * (Time / Count);
    X1 := CenterX + round(Len1 * cos(Ro));
    Y1 := CenterY + round(Len1 * sin(Ro));
    Len2 := Len - Len1;
    X2 := CenterX - round(Len2 * cos(Ro));
    Y2 := CenterY - round(Len2 * sin(Ro));
    
    LockDrawing;
    ClearWindow(clWhite);
    SetPenColor(clBlue);
    Line(X1, Y1, X2, Y2);
    SetPenColor(clRed);
    Circle(CenterX, CenterY, r);
    Redraw;

  end;

end.
  • Вопрос задан
  • 2862 просмотра
Решения вопроса 2
Мне кажется, это проще всего решить в полярных координатах.
Точка, если я правильно понял условие, вообще зафиксирована на экране - например в центре - а вокруг нее вращается отрезок.
При этом угол RO полярных координат изменяется линейно во времени,
длины "хвостов" отрезка с разных сторон точки тоже меняются линейно во времени.

В итоге имеем что-то наподобие :

iCnt:=300; fLen:=200;
for iTime:=0 to iCnt-1 do
    begin
    fRo:=iTime/iCnt*2*PI;
    fLen1:=fLen*(iTime/iCnt);
    iX1:=iXCenter+round(fLen1*cos(fRo));
    iY1:=iYCenter+round(fLen1*sin(fRo));
    fLen2:=fLen-fLen1;
    iX2:=iXCenter-round(fLen2*cos(fRo));
    iY2:=iYCenter-round(fLen2*sin(fRo));
    // отрисовка
    end;
Ответ написан
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
Не хватает данных. Вращение равномерное?

И сколько оборотов совершит отрезок за время прохождения центра от начала отрезка до конца.

А так задача не кажется сложной. Вам надо найти координаты концов отрезка в любой момент времени и построить отрезок.

Пусть отрезок начинает движение, находясь в вертикальном положении, с началом отрезка в точке 0,0. Пусть скорость вращения w (рад/с), скорость движения точки по отрезку v ([Длина А, далее просто А]/с),
через отрезок времени t мы имеем для начала отрезка:
Угол ф=w*t
Пройденный путь по отрезку с=v*t
Начальная точка:
x1 = -c*sin(ф)
y1 = -c*cos(ф)
Конечная точка:
x2 = (A-c)*sin(ф)
y2 = (A-c)*cos(ф)
Соответственно, задаете малый промежуток времени и выполняете пока значение с не будет равно А.
Вроде так..

upd: вот, накидал пример на том, что знаю
jsfiddle.net/iiil/ZFugz/11
Формулы несколько отличаются, но это из-за особенностей реализации. тот алгоритм, что я привел выше верный. В примере скорость выражена через величину А коэффициентом cv. Скорость w задано абсолютно, но ее можно тоже выразить через А и количество оборотом, там уж думаю с формулами сами разрулите.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы