Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Alexey6522 (статус: 1-ый класс)
Вопрос отправлен: 12 февраля 2010, 16:25
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 13 февраля 2010, 11:49; участников в обсуждении: 3.
Dron

Dron (статус: Студент), 12 февраля 2010, 18:12 [#1]:

А что мешает из всех координат X вычитать некоторое значение и получать таким образом отрицательные координаты? Если весь диапазон по ширине - W, то сдвиг делаем на W/2 и получаем начало координат по середине. Аналогично с высотой - H/2. Центр получается в середине экрана (середине канвы).
С уважением.
Alexey6522

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

Dron (статус: Студент), 12 февраля 2010, 18:29 [#3]:

Цитата (Alexey6522):

в чем ошибка

В 17-ой строке?

Опишите, в чём именно проблема?
С уважением.
Alexey6522

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

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

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

Dron (статус: Студент), 13 февраля 2010, 11:26 [#8]:

Для написания игр лучше взять движок DirectX или OpenGL - с канвой замучаетесь :-)
Насчёт отражения луча - тут чистая геометрия :-)
С уважением.
Alexey6522

Alexey6522 (статус: 1-ый класс), 13 февраля 2010, 11:49 [#9]:

Предел воображения программиста, ограничивается компилятором :-D
А кто сказал что я хочу сделать игру ;)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.