我在image上用鼠标画了一个不规则的图像,需要计算面积,大家帮我看看对不对呀呀
用它取得边界
procedure CreateRGN(BorderPointDynArray: array of TPoint): HRGN;
begin
  Result := CreatePolygonRgn(BorderPointDynArray[0], 
  Length(BorderPointDynArray), WINDING);
end;比如点为 APoint,计算到的区域为 ARGN
Result := PtInRegion(ARGN, APoint.x, APoint.y)这样行吗,为什么我得到的总是零呀!!
var
  rgn:hrgn;
  kk:array[1..1000] of Tpoint;
//kk为得到的坐标点
rgn:=CreateRGN(kk);
for x:=minx to maxx do 
  for y:=miny to maxy do
      if PtInRegion(ARGN, kk[x].x, kk[y].y) then
   s:=s+1

解决方案 »

  1.   

    你调用rgn:=CreateRGN(kk);的意义是什么?CreateRGN这个是根据你的点阵生成一个区域,
    你在image上,既然知道了要计算的区域ARGN,那个就遍历一下image上的所有的点在不在这个区域不就行了么
    s := 0;
    for y := 0 to image.height - 1 do
      for x := 0 to image.width - 1 do
        if PtInRegion(ARGN, x, y) then inc(s);
      

  2.   

    (1)将这个不规则的图形用用一组平行于 轴的直线进行分割;(2)在每一个小的图形上作出一个小矩形;(3)用这个小矩形的面积代替小不规则图形的面积;(4)对这些小矩形求和,得到所求区域面积 的近似值;(5)将前面的分割无限加细,所得到的极限就是所求区域面积 。这实际上就是微积分算法,分到最小,实际上就是数像素,再用像素个数换成一个单位面积你写的东西我没看懂,按你的写法PtInRegion(ARGN, APoint.x, APoint.y)应该返回是Boolean类型的建议你跟踪一下,跟踪一下肯定出来了
      

  3.   

    看看我写的,问题是还是不对!!!真的不知道为什么了!!!
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        Image1: TImage;
        ADOQuery1: TADOQuery;
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      i,maxX,minX,maxY,minY:integer;
      ks:boolean;
      kk:array[0..10000] of Tpoint;
      rpnt,mpnt:Tpoint;  function CreateRGN(BorderPointDynArray: array of TPoint): HRGN;implementation{$R *.dfm}procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     ks:=true;
      maxx:=x;
      minx:=x;
      maxy:=y;
      miny:=y;
      mpnt:=point(x,y);
      rpnt:=mpnt;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if not (ks) then exit;
      image1.Canvas.MoveTo(mpnt.X ,mpnt.Y );
      image1.Canvas.LineTo(x,y);
      mpnt:=point(x,y );
      kk[i].x:=x;
      kk[i].Y :=y;
      i:=i+1;
      if x>maxx then maxx:=x;
      if x<minx then minx:=x;
      if y>maxy then maxy:=y;
      if y<miny then miny:=y;end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
        rgn:Hrgn;
        s:integer;
      begin
      if not (ks) then exit;
      rgn:=  CreateRGN (kk);
      for x:=0 to image1.Width-1  do
        for y:=0 to image1.Height-1  do
          if PtInRegion(RGN, x, y) then inc(s);
      caption:=inttostr(s);
      s:=0;
      ks:=false;end;
    function CreateRGN(BorderPointDynArray: array of TPoint): HRGN;
    begin
      Result := CreatePolygonRgn(BorderPointDynArray[0],
      Length(BorderPointDynArray), ALTERNATE);
    end;
    end.
      

  4.   

    maxx:=x;
      minx:=x;
      maxy:=y;
      miny:=y;(movedown里面的)
    老大,你这几句写的什么意思啊这点东西写的问题太多了,10000个点够干什么啊?多划拉两下就out bound了