pascal中透明像素的多边形

时间:2015-09-06 18:26:05

标签: pascal

对于隐藏对象游戏碰撞检测,以下代码使用zengl   生成纹理边缘周围的点(设计时间):

tex_GetData(txtr, myData );
for h:=0 to txtr.Height-1 do
begin
    for w:=0 to txtr.Width-1  do
    begin
        if  (PByte(Ptr(myData) + w* 4 + h * realWidth * 4 +3)^>50)and (PByte(Ptr(myData) + w* 4 + h * realWidth * 4 +3)^<150) then
        begin
            inc(counter);
            if counter mod (cn)=0 then
                if cntr<>100 then
                    begin
                    inc(cntr);
                    // setlength(points,(cntr+1));

                    points[cntr].X:=w;

                    points[cntr].y:=w;

                    end ; 

问题在于从给定点制作多边形。多边形是错误的方式。 现在尝试通过迭代检测沿着每个边缘的第一个像素 宽度(0到宽度),每次宽度增加一个高度将从顶部(= 0)迭代,直到第一次没有透明的pexil,并且当宽度将增加1直到扫描顶部区域时将重置为零。 循环在这里不能很好地工作:

//Top
w:=1;
h:=1;

for w:=0 to texture.Width-1 do
    while(h<txtr.Height-2)do
    begin  

        if  (PByte(Ptr(myData) + w* 4 + h * realWidth * 4 +3)^)=255 then
        begin
            inc(h);

            inc(cntr);
            setlength(points,(cntr+1));
            points[cntr].X:=w;

            points[cntr].y:=h;
            continue;
        end;

        break;


    end ;

但它停止了一半。 我的愿望是通过绘制多边形线的点数组来进行迭代,以获得最接近的形状:

for i:=1 to length(points)-1 do
    begin
        pr2d_Line(points[i].X,points[i].y,points[i+1].X,points[i+1].y,$FF0000,255);
    End;

我希望看到正确循环的示例。

更新

  if  (PByte(Ptr(myData) + w* 4 + h * realWidth * 4 +3)^)=255 then

上面这行只是为了检测pbytearray中没有透明像素而且它有效(如果像素[w,h]不透明的话)。 只需通过旋转其边界扫描图像中的每个像素来查找图像中的第一个无透明像素,例如: 从右到左扫描顶部,从上到下扫描,从右到左扫描底部,最后从下到上扫描。 不确定它是否称为矢量,但会生成一个点数组,并且一个循环调用它们,如果它们的点连接,结果将是一个多边形,它采用相同的栅格形状。

0 个答案:

没有答案