画图!!!(100分)

  • 主题发起人 主题发起人 trancechow
  • 开始时间 开始时间
form1.label1.canvas.pixels[x,y]:=form1.image1.canvas.pixels[x,y];
直接进行赋值操作咯~

我是通过bresenham算法取点来画圆的。
 
可是我是使用tcanvas的函数来画图形,我并不知道这些图形包含了哪些点
 
那我的方法就不适合你了,除非你改变画图的方法,呵呵~
 
天哪,难道没有解决的办法吗?
 
在开始画(OnMouseDown)之前将图片保存下来
在重画之前先恢复总个图片
再用 Pen.Mode:=pmCOPY 的方式画图
就是这么简单

简单示例:
var
AImg: TBitmap;

procedure Save(Image: TBitmap);
begin
if not Assigned(AImg) then
begin
AImg:=TBitmap.Create;
AImg.Width:=Image.Width;
AImg.Height:=Image.Height;
end;

AImg.Assign(Image);
end;

procedure Restore(Image: TBitmap);
begin
if not Assigned(AImg) then
Exit;

Image.Assign(AImg);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Save(Image.Picture.Bitmap);
Drawing := True;
Image.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
StatusBar1.Panels[0].Text := Format('Origin: (%d, %d)', [X, Y]);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Drawing then
begin
Restore(Image.Picture.Bitmap);
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing := False;
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
begin
//DrawShape(Origin, MovePt, pmNotXor);
Restore(Image.Picture.Bitmap);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmCopy);
end;
StatusBar1.Panels[1].Text := Format('Current: (%d, %d)', [X, Y]);
end;
 
搞掂,五体投地,我太笨了
 
我个人认为这算法太差,效率太低
比如说在<<星际争霸>>中鼠标选取的绿色框架用你的方法就完全不行!
 
效率还能忍,不过其他难道还有办法吗
 
后退
顶部