Project1

标题: 填充一个三角形 [打印本页]

作者: IamI    时间: 2008-3-2 21:35
标题: 填充一个三角形
好吧我承认又是超级生僻的问题……
长话短说:
有一个bitmap;
三个点:X1,Y1,X2,Y2,X3,Y3
一个颜色Color
用这三个点组成三角形用Color填充,就这样。
(如果需要其它条件说出来无妨)
P.S.如果跟我说一个点一个点填充那就算了吧== [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~ [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 水迭澜    时间: 2008-3-2 21:38
我记得以前我写过一段代码来回这个问题……
http://rpg.blue/viewthread.php?tid=78779

代码如下:

def draw_triangle(x1,y1,x2,y2,x3,y3,color=Color.new(0,0,0,255))
triangle=Sprite.new
triangle.bitmap=Bitmap.new(640,480)
x=0
k1=(y2-y1)*1.0/(x2-x1)
k2=(y3-y1)*1.0/(x3-x1)
k3=(y3-y2)*1.0/(x3-x2)
height=1
for x in x1..x2
     y = (x-x1)*k1+y1 #求出点
     height = (x-x1)*k2+y1-y
     if height < 0
       y+=height
       height = 0 - height
     end
     triangle.bitmap.fill_rect(x, y, 1, height, color)
   end
   for x in x2..x3
     y = (x-x2)*k3+y2
     height = (x-x1)*k2+y1-y
     if height < 0
       y+=height
       height = 0 - height
     end
     triangle.bitmap.fill_rect(x, y, 1, height, color)
   end
end


简单来说就是算切线斜率,然后用fill_rect填充两条线之间的部分。
其实血条脚本也是这么画的…… [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: IamI    时间: 2008-3-2 21:42
好的拿走,效率应该还不错吧==,另:看到水水的签名就知道遇到诡异的事情了
作者: Iselia雪    时间: 2008-3-2 21:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-2 21:52
望楼上,其实U可以把一个八角形拆为若干个三角形试试…… [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: IamI    时间: 2008-3-2 21:54
望天==我要一帧八九个三角形(很小)而且3个x值必定会有2个相等,怎么办……
作者: 水迭澜    时间: 2008-3-2 21:58
那个,你在我那个脚本里加一个判断就可以
def draw_triangle(x1,y1,x2,y2,x3,y3,color=Color.new(0,0,0,255))
triangle=Sprite.new
triangle.bitmap=Bitmap.new(640,480)
x=0
if x2 != x1
  k1=(y2-y1)*1.0/(x2-x1)
end
if x3 != x1
  k2=(y3-y1)*1.0/(x3-x1)
end
if x3 != x2
  k3=(y3-y2)*1.0/(x3-x2)
end
height=1
if x1 != x2
for x in x1..x2
    y = (x-x1)*k1+y1 #求出点
    height = (x-x1)*k2+y1-y
    if height < 0
      y+=height
      height = 0 - height
    end
    triangle.bitmap.fill_rect(x, y, 1, height, color)
  end
end
if x2 != x3
  for x in x2..x3
    y = (x-x2)*k3+y2
    height = (x-x1)*k2+y1-y
    if height < 0
      y+=height
      height = 0 - height
    end
    triangle.bitmap.fill_rect(x, y, 1, height, color)
  end
end
end

不知道这么干行不。
一祯一个我不知道效果如何,记得画CP条的时候FPS降的也不是很多,不过肯定有影响吧= =
作者: Iselia雪    时间: 2008-3-2 21:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-2 22:04
望LS,其实这个算法稍微有点不够优化了……因为这个判断需要两个for嵌套,平均速度会是直接fill_rect的2次方=v=|||(<---刚学数据结构才教到这里的人)
其实如果用宽度为1的线fill_rect还是慢,并且不追求画面质量的话也可以把线宽设置为2= =
总之减少循环次数应该对速度有改进吧~
作者: IamI    时间: 2008-3-2 22:17
经测试,可以,至于效率……以后再说,花了100分啊,水水在刷吗==
作者: Iselia雪    时间: 2008-3-2 22:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-2 22:22
<1s是肯定的,但你配合上其他效果再加上每祯一次……一秒40祯……= =
总之当然是能优化就优化吧XD
作者: IamI    时间: 2008-3-2 22:28
以下引用Iselia雪于2008-3-2 14:19:34的发言:

LS大姐小看Ruby的处理能力哟~~

@a = Sprite.new
@a.bitmap = Bitmap.new(640,480)
@c = Color.new(0,0,0,255)
for i in 1..640
for j in 1..480
@a.bitmap.set_pixel(i,j,@c)
end
end
@a.update

全过程 〈 1s

ORZ……我才14,理解能力跟不上- -||||
头痛...等到好点慢慢想吧。

我是15的正太==自己试了一下就是VB的处理System.drawing.bitmap也很慢,像沉影不器的灰度脚本都是几秒钟才出来,总之,
逐点逐点处理=慢死=卡死
作者: 沉影不器    时间: 2008-3-2 23:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2009-6-12 08:00
还行- -
这个东西有点问题,首先x1、x2、x3必须由小到大还不能相等,另外就是要放到某个类里边并且刷新
只画一个三角形的话不会有问题的,只是不知道你要画多少?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1