|
Вопрос # 3 764/ вопрос открыт / |
|
Всем привет! Вопрос такой, допустим нужно нарисовать линию оси X и Y:
X1:=50;
Y1:=50;
X2:=100;
Y2:=100;
Image1.Canvas.MoveTo(X1, Y1);
Image1.Canvas.LineTo(X2, Y2);
А потом продолжить луч от начальной точки X1:Y1 в противоположную сторону от X2:Y2, таким образом X1 и Y1 получатся серединой всей линии.
Вся сложность в том что, при рисовании на Canvas там нет такого понятия как -X и -Y есть только X и Y с положительными значениями. Например во всем известном Paint при рисовании линии видно как начальная точка берется за 0 и при перемещении линии в левую часть ее координаты меняются на (-)
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: Alexey6522 (статус: 1-ый класс)
Вопрос отправлен: 12 февраля 2010, 16:25
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 13 февраля 2010, 11:49; участников в обсуждении: 3.
|
Dron (статус: Студент), 12 февраля 2010, 18:12 [#1]:
А что мешает из всех координат X вычитать некоторое значение и получать таким образом отрицательные координаты? Если весь диапазон по ширине - W, то сдвиг делаем на W/2 и получаем начало координат по середине. Аналогично с высотой - H/2. Центр получается в середине экрана (середине канвы).
С уважением.
|
|
Alexey6522 (статус: 1-ый класс), 12 февраля 2010, 18:17 [#2]:
в чем ошибка
var
orig, move:TPoint;
Draw:bool;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Draw:=true;
orig:=Point(X, Y);
Canvas.Pen.Color := clRed;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Draw = true then begin
Form1.Repaint;
Canvas.Polyline([orig, Point(x, y)]);
Caption:='X = '+IntToStr(X-orig.X)+'; Y = '+IntToStr(orig.Y-Y);
move.Y:= (Y - orig.Y)*2 + Y;
move.X:= (orig.X - X)*2;
if move.X > X then
move.X:=move.X - X
else
move.X:=X - move.X;
Canvas.Polyline([orig, Point(move.X, move.Y)]);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Draw:=false;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Draw:=false;
end;
end.
|
|
Dron (статус: Студент), 12 февраля 2010, 18:29 [#3]:
Цитата (Alexey6522):
в чем ошибка
В 17-ой строке?
Опишите, в чём именно проблема?
С уважением.
|
|
Alexey6522 (статус: 1-ый класс), 12 февраля 2010, 18:40 [#4]:
В самом коде ошибки нету, он работает не так как хотелось бы,
в место того что бы продолжить "луч" он рисует отраженно-зеркальную линию V образную.
|
|
Мережников Андрей (статус: Абитуриент), 12 февраля 2010, 21:44 [#5]:
для чего это условие
if move.X > X then
move.X:=move.X - X
else
move.X:=X - move.X; ???
И что за сложение в строке:
move.Y:= (Y - orig.Y)*2 + Y;???
|
|
Alexey6522 (статус: 1-ый класс), 12 февраля 2010, 22:56 [#6]:
{Я разобрался сам, если интересно вот полный код программы
На форму поместить 4 Label
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label4: TLabel;
Label3: TLabel;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
orig, move:TPoint;
Draw:bool;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
orig:=Point(X, Y);
Draw:=true;
Canvas.Pen.Color := clRed;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Draw = true then begin
Form1.Repaint;
Canvas.Polyline([orig, Point(x, y)]);
Label4.Caption:='Позиция X1 и Y1 > X = '+IntToStr(X-orig.X)+'; Y = '+IntToStr(orig.Y-Y);
if orig.Y >= Y then begin
move.Y:=(orig.Y - Y)*2;
if move.Y > Y then
move.Y:= move.Y + Y
else
move.Y:= Y + move.Y;
end else begin
move.Y:=Y - (Y - orig.Y)*2;
end;
if orig.X >= X then begin
move.X:= (X - orig.X)*2;
if move.X > X then
move.X:= move.X - X
else
move.X:= X - move.X;
end else begin
move.X:= (orig.X - X)*2;
if move.X > X then
move.X:= move.X + X
else
move.X:= X + move.X;
end;
Canvas.Polyline([Point(orig.X, orig.Y), Point(move.X, move.Y)]);
Label2.Caption:='Позиция X2 и Y2 > X = '+IntToStr((orig.X-X))+'; Y = '+IntToStr((Y-orig.Y));
end;
Label1.Caption:='Позиция курсора > X = '+IntToStr(X)+'; Y = '+IntToStr(Y);
Label3.Caption:='Позиция Ox и Oy > X = '+IntToStr(orig.X)+'; Y = '+IntToStr(orig.Y);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Draw:=false;
Form1.DoubleBuffered:= true;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Draw:=false;
end;
end.
|
|
Alexey6522 (статус: 1-ый класс), 12 февраля 2010, 23:03 [#7]:
Если в этом куске кода все *2 заменить скажем на 8, луч будет длинней в 8 раз чем отрезок.
Пример:
if orig.Y >= Y then begin
move.Y:=(orig.Y - Y)*8;
if move.Y > Y then
move.Y:= move.Y + Y
else
move.Y:= Y + move.Y;
end else begin
move.Y:=Y - (Y - orig.Y)*8;
end;
if orig.X >= X then begin
move.X:= (X - orig.X)*8;
if move.X > X then
move.X:= move.X - X
else
move.X:= X - move.X;
end else begin
move.X:= (orig.X - X)*8;
if move.X > X then
move.X:= move.X + X
else
move.X:= X + move.X;
end;
Спросите для чего все это, хотя бы для того, что бы в игре бильярд сделать подсказку куда полетит шар, только вот осталось реализовать преломление луча, что бы показать куда шар полетит, отскочив от бортика
|
|
Dron (статус: Студент), 13 февраля 2010, 11:26 [#8]:
Для написания игр лучше взять движок DirectX или OpenGL - с канвой замучаетесь 
Насчёт отражения луча - тут чистая геометрия
С уважением.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|