Привет=) Есть линия, начало которой привязано к центру координат(х1, у1=320, 240), направленная под произвольным углом α. Нужно, чтобы черная точка прошла по всей белой линии, не выходя за её пределы толщины. Толщина точки равна толщине линии. Как это реализовать?
Из заданных 2-х точек прямой (центр и (x1, y1)) получаешь уравнения прямой - F(x).
Ну а далее все просто, в цикле по Х от Х(центра) до X1 выводи точку с координатами (x, F(x));
А можно код?
Можно и так
В общем вот набросок. Для наглядности отрисовывается маленькая окружность вместо точки. И через некоторый промежуток.
uses Crt, Graph;
function F(x: Integer) : Integer;
begin
F := round(3/4 * x);
end;
var
gd, gm: Integer;
x: Integer;
begin
gd := Detect;
InitGraph(gd, gm, '');
line(0, 0, 320, 240);
SetColor(Red);
x := 0;
while (x <= 320) do begin
circle(x, F(x), 2);
delay(300);
inc(x, 20);
end;
readkey;
end.
Написал, но работает только в частном случае..( По-моему, неправильно высчитывается F(x):
Uses Graph,Crt;
Function F(x: Integer): Integer;
Begin
F:=Round(3/4*x);
End;
Var GD,GM: Integer;
x: Integer;
Begin
GD:=Detect;
InitGraph(GD,GD,'');
Line(320,240,640,480);
ReadLn;
SetColor(Red);
x:=320;
While (x<400) Do
Begin
PutPixel(x,F(x),Red);
Delay(30000);
inc(x,20);
End;
Readln
End.
Уравнени у меня рассчитано для прямой проходящей через точки с координатами [(0, 0) ; (320, 240)] так я понял надо по заданию. Если тебе нужа универсальная программа, поищи по форуму или сам выведи как получить уравнение прямой заданной по двум точка [(x1, y1); (x2, y2)]
Вот формула :
(x - x1) / (x2 - x1) = (y - y1) / (y2 - y1)
Может я чего не понимаю, но
Если так, то можно допустить некоторое отклонение от линии
uses graph,crt;
const x1=320;
y1=240;
x2=500;
y2=400;
function F(x: Integer): Integer;
begin
f:=round( ((x-x1)/((x2-x1)*(y2-y1)))+y1 );
end;
Var gd,gm,x,i: Integer;
begin
gd:=detect;
initgraph(gd,gm,'');
line(x1,y1,x2,y2);
x:=340;
for i:=1 to 20 do
begin
putpixel(x,f(x),red);
inc(x,20);
delay(30000)
end;
readln
end.
Ну, наверное, потому, что функция написана неправильно?
function F(x: Integer): integer;
begin
f:=round((x-x1)*(y2-y1)/(x2-x1)) + y1;
end;
Уряяяя!!!!! Спасибо!
Кадр 11 дубль 2.. Почему функция работает некорректно? Если задать в констнтах x2=639, y2=479, то точка во время движения на полпути резко смещается по y примерно на 100 пикселей вверх! В чем дело?
Смотря, что ты еще изменял. У меня, например, выдает вот такие значения: 340 255
360 270
380 285
400 300
420 315
440 330
460 345
480 360
500 375
520 390
540 405
560 420
580 435
600 450
620 465
640 480
660 495
680 510
700 525
720 540
(первый столбец - X, второй - Y)... Как видишь, никакого скачка.
P.S.
Отставить мой предыдущий пост. Он просто еще раз показывает преимущество 32-битных компиляторов. У тебя по ходу вычисления происходит переполнение. Промежуточный результат не помещается в Integer, и как результат - усечение...
Вот патч:
function F(x: Integer): integer;
begin
f:=round(LongInt(x-x1)*(y2-y1)/(x2-x1)) + y1;
end;
Еще вопрос, в тему. Есть прямая, которая крутится, начало которой закреплено в центре экрана: x1=320, y1=240. Длина прямой-20. Как найти координаты x2, y2, которые являются продолжением этой прямой до границы экрана? Нужно получить уравнение этой прямой.
Ну тогда соклько раз можно повторять одно и тоже.
Поиск -> "Движение окружности", "Маятник" , "Система маятников"
Нет, смысл не в этом. Дописываю курсовик, там в центре экрана стоит охотник и стреляет в мышек. Когда охотник правильно прицелился на мышку, тогда понятно, в какую конечную точку летит пуля-в точку координаты мышки. А если он прицелен неправильно? Куда тогда должна лететь пуля? Ружьё охотника-это прямая, которая движется по окружности, и координаты для функции рисования прямой есть: x1,y1,x2,y2, где x1,y1=320,240. То бишь нужно найти продолжение этой прямой до границы экрана, найти ту точку на границе экрана, в которую должна лететь пуля (по траектории прямой) при промахе охотника.
Я тебе предлагал перейти в полярную систему координат, в которой этой проблемы вообще не возникло бы? Предлагал. Ты не захотел? Не захотел...
Вот и сиди, мучайся...
Как перейти к полярной системе координат? У меня весь курсовик ориентирован на начало координат в центре экрана! Много нужно переписывать?
Если это та прога про охоту на мышек, с которой я когда-то даже чуток помогал, то ведь там уже и есть полярная система! Там нажатиями на клавиши меняется угол направления ружья, а само ружье рисуется, как линия между двумя точками - началом координат (центром экрана) и точкой, координаты которой вычисляются, исходя из угла поворота ружья и длины ствола. Аналогичным образом координаты пули в каждый момент можно вычислить, исходя из все того же самого угла поворота ружья и расстояния, которое пролетела пуля от центра экрана. В цикле увеличиваем это расстояние и вычисляем новые положения пули, пока она не улетит за экран. Могу накидать примерчик, но не сегодня.
Удачи!
Бродяжник, СПАСИБО!! Всё сделал, всё работает