如何改变座标原点?(50分)

  • 主题发起人 主题发起人 hthugm
  • 开始时间 开始时间
H

hthugm

Unregistered / Unconfirmed
GUEST, unregistred user!
一般座标原点在控件的左上角,用什么语句改变原点在控件的任意位置?
另求援各位大侠:
谁有“历史曲线”和“实时曲线”作图的源程序请E——MAIL 给我,我不胜感激
我的e_Mail:hthuguangming@21cn.com
 
其实不用坐标变换而是自己转换也不麻烦的啊,初中的数学水平就够用了。
 
对啊,自己转换也不麻烦的。以下是跟座标相关的API函数,其中第一个就是改变
坐标原点的:
SetWindowOrgEx()
SetViewportOrgEx()
SetWindowExtEx()
SetViewPortExtEx()
 
To:Huzzz
小弟我是菜鸟一个,“自己转换也不麻烦的”,究竟怎么转换?如有一个PaintBox,
我要把原点移到PaintBox的任一位置用SetViewPortOrgEX() 和SetWindowOrgEX(),是
要SetMapMode()配合的而且它们不支持MM_Text模式的?希望给出原码不胜感激!!
procedure TForm1.Button1Click(Sender: TObject);
var
PreMapMode:Integer;
begin
PreMapMode:=SetMapMode (Canvas.Handle,mm_anisotropic);
SetViewPortorgEx(PaintBox1.Canvas.Handle,0,PaintBox1.Clientheight,nil);
paintBox1.Canvas.MoveTo (0,0);
PaintBox1.Canvas.LineTo (50,50);
end;
一运行什么都有没有?希望给我分析一下马上发分。
 
to fat
你要先设好paintbox的pen啊,如width,color,etc..
 
SetWindowOrgEx的意思是把屏幕的左上点坐标映射为指定坐标。
procedure TForm1.Button1Click(Sender: TObject);
begin
SetWindowOrgEx(PaintBox1.Canvas.Handle,-50,-50,nil);
PaintBox1.Canvas.MoveTo (0,0);
PaintBox1.Canvas.LineTo (50,50);
end;
 
在form的onpaint事件中重画。
 
To:Huzzz
你好!
我希望把原点映射到PaintBox的左下角,Y轴方向向上,X轴向右
SetWindowOrgEx(PaintBox1.Canvas.Handle,paintBox1.left,
paintBox1.top+paintBox1.clientHeight ,nil);
PaintBox1.Canvas.MoveTo (0,0);
PaintBox1.Canvas.LineTo (50,60););//把60改成-60还是一样

一运行什么还是什么都没有?怎么回事?


 
自己转换也不麻烦的,以下三个子程序将屏幕坐标系转换为笛卡儿坐标系

procedure MoveTo(x, y: integer);
begin
Form1.PaintBox1.Canvas.MoveTo(x, Form1.PaintBox.Height - y);
end;

procedure LineTo(x, y: integer);
begin
Form1.PaintBox1.Canvas.LineTo(x, Form1.PaintBox.Height - y);
end;

procedure Line(x1, y1, x2, y2: integer);
begin
Form1.PaintBox1.Canvas.MoveTo(x1, Form1.PaintBox.Height - y1);
Form1.PaintBox1.Canvas.LineTo(x2, Form1.PaintBox.Height - y2);
end;
 
自己转换也不麻烦,但映射有特殊的好处(一时也说不清),大部分情况下,我们是
两种都要:既自己转换,又加上映射。

to hthugm:
你那个只改了坐标原点,没有改方向,我先看看吧,行的话一会再告诉你。
 
to hthugm:
你要的映射方法如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
with PaintBox1 do
begin
SetMapMode(Canvas.Handle, MM_ANISOTROPIC);
SetWindowExtEx(Canvas.Handle, Width, Height, nil);
SetWindowOrgEx(Canvas.Handle, 0, 0, nil);

SetViewportExtEx(Canvas.Handle, -Width, -Height, nil);
SetViewportOrgEx(Canvas.Handle, Width, Height, nil);

Canvas.MoveTo(0, 0);
Canvas.LineTo(180, 60);
end;
end;
 
上面映射X轴方向为向左,向右的如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
with PaintBox1 do
begin
SetMapMode(Canvas.Handle, MM_ANISOTROPIC);
SetWindowExtEx(Canvas.Handle, Width, Height, nil);
SetWindowOrgEx(Canvas.Handle, 0, 0, nil);

SetViewportExtEx(Canvas.Handle, -Width, -Height, nil);
SetViewportOrgEx(Canvas.Handle, 0, Height, nil); //

Canvas.MoveTo(0, 0);
Canvas.LineTo(180, 60);
end;
end;
 
SetWindowOrgEx()
SetViewportOrgEx()
SetWindowExtEx()
SetViewPortExtEx()
就是类似设备坐标系和窗体坐标系的转换:)
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
839
DelphiTeacher的专栏
D
D
回复
0
查看
845
DelphiTeacher的专栏
D
D
回复
0
查看
679
DelphiTeacher的专栏
D
S
回复
0
查看
846
SUNSTONE的Delphi笔记
S
S
回复
0
查看
778
SUNSTONE的Delphi笔记
S
后退
顶部