不规则四边形的颜色填充(100分)

  • 主题发起人 主题发起人 lzlishl
  • 开始时间 开始时间
L

lzlishl

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 前提条件:一个不规则四边形,每个顶点对应一个颜色值,如C1、C2、C3、C4
2. 问题:寻找快速填充算法,该算法采用内插(可以是任意内插方法),使得区域内各点的填充色由四个顶点的颜色内插而得,从而实现区域内各点颜色光滑过渡。如果有现成的函数能够实现上述功能,最好。
3. 要点:速度和效率,因为需要填充的四边形很多。
 
to:xmcccc
老大,能否说详细点.

本人查到一个winAPI函数GradientFill(HDC hdc, CONST PTRIVERTEX pVertex, DWORD dwNumVertex, CONST PVOID pMesh, DWORD dwNumMesh, DWORD dwMode),其中的一些数据结构,如pVertex,pMesh,不知到是如何定义的.哪位用过,给点指示.谢谢!
 
转一下delphi的
typedef struct _TRIVERTEX {
LONG x;
Long y;
COLOR16 Red;
COLOR16 Green;
COLOR16 Blue;
COLOR16 Alpha;
}TRIVERTEX, *PTRIVERTEX;

pMesh 指向下面结构体数组的.

typedef struct _GRADIENT_TRIANGLE {
ULONG Vertex1;
ULONG Vertex2;
ULONG Vertex3;
}GRADIENT_TRIANGLE, *PGRADIENT_TRIANGLE;
 
to:总有爱
这不是Delphi的定义!
听高人讲pVertex,pMesh的结构及其数据格式给使用Delphi的调用者带来了不小的麻烦。
有人真正在delphi中用过GradientFill函数吗,给个例子或建议,拜托。
 
PTriVertex = ^TTriVertex;
{$EXTERNALSYM _TRIVERTEX}
_TRIVERTEX = packed record
x: Longint;
y: Longint;
Red: COLOR16;
Green: COLOR16;
Blue: COLOR16;
Alpha: COLOR16;
end;
TTriVertex = _TRIVERTEX;

_GRADIENT_TRIANGLE = packed record
Vertex1: ULONG;
Vertex2: ULONG;
Vertex3: ULONG;
end;
TGradientTriangle = _GRADIENT_TRIANGLE;
 
to:总有爱
我试着调用,没有得到预想的过度色,只得到全黑色填充,不知道原因为何?是什么地方设置错误?

代码如下:
Type
PTriVertex = ^TTriVertex;
{$EXTERNALSYM _TRIVERTEX}
_TRIVERTEX = packed record
x: Longint;
y: Longint;
Red: COLOR16;
Green: COLOR16;
Blue: COLOR16;
Alpha: COLOR16;
end;
TTriVertex = _TRIVERTEX;

_GRADIENT_TRIANGLE = packed record
Vertex1: ULONG;
Vertex2: ULONG;
Vertex3: ULONG;
end;
TGradientTriangle = _GRADIENT_TRIANGLE;
....

Var
myVert:array[0..2] of TTriVertex;
tmVert:array[0..2] of PTRIVERTEX;
gMesh: GRADIENT_TRIANGLE;//
Color:Array[0..3] of TColor;
Begin
....
for I := 0 to 2 do
Begin
myvert.x :=Surface.X; //左上角x
myvert.y :=Surface.Y; //左上角y
myvert.Red :=Word(GetRValue(Color));
myvert.Green :=Word(GetGValue(Color));
myvert.Blue :=Word(GetBValue(Color));
myvert.Alpha := 0;
end;

CopyMemory(@tmVert[0],@myvert[0],48);

gMesh.Vertex1 :=0;
gMesh.Vertex2 :=1;
gMesh.Vertex3 :=2;

GradientFill(Handle,@tmVert,3,@gMesh,1,2);
end.
 
这个要图形中的裁减算发 哪个就是扫描线 填充发 可以做过度颜色的
 
to:delphfans
谢谢关注.其实用GradientFill函数可以实现上述目标,实际上目前也接近成功,只是GradientFill函数使用中参数的设置没搞定,填充形状出来了(使用两次三角形填充),但是
填充色不对,不仅没有过渡色,填充色变成了黑色.
在Delphi岁使用过GradientFill的大富翁,请施以援手.
 
问题已经解决.上述调用没有问题,问题出在颜色值的设置上,仅仅使用WORD强制转换,并不能将一个Byte类型的颜色分量成功赋给R,G,B,必须将该数值乘256才可以.
 
散分,谢谢各位参与.
 
后退
顶部