Project1

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

作者: 我是我的马甲    时间: 2008-3-9 19:56
标题: 还是填充一个三角形= =
这是上次水水给出的填充一个三角形的答案:
  1. def draw_triangle(x1,y1,x2,y2,x3,y3,color=Color.new(0,0,0,255))
  2. triangle=Sprite.new
  3. triangle.bitmap=Bitmap.new(640,480)
  4. x=0
  5. if x2 != x1
  6. k1=(y2-y1)*1.0/(x2-x1)
  7. end
  8. if x3 != x1
  9. k2=(y3-y1)*1.0/(x3-x1)
  10. end
  11. if x3 != x2
  12. k3=(y3-y2)*1.0/(x3-x2)
  13. end
  14. height=1
  15. if x1 != x2
  16. for x in x1..x2
  17.    y = (x-x1)*k1+y1 #求出点
  18.    height = (x-x1)*k2+y1-y
  19.    if height < 0
  20.      y+=height
  21.      height = 0 - height
  22.    end
  23.    triangle.bitmap.fill_rect(x, y, 1, height, color)
  24. end
  25. end
  26. if x2 != x3
  27. for x in x2..x3
  28.    y = (x-x2)*k3+y2
  29.    height = (x-x1)*k2+y1-y
  30.    if height < 0
  31.      y+=height
  32.      height = 0 - height
  33.    end
  34.    triangle.bitmap.fill_rect(x, y, 1, height, color)
  35. end
  36. end
  37. end
复制代码

大概的原理就是一条线一条线的扫描……
但是上个礼拜得到答案后发现我并不需要如此大的自由空间……
现在的要求是:
def draw_rt_triangle(bitmap,x1,y1,x2,y2,color)
x3 = x1
y3 = y2
换句话说就是要牺牲原来的描绘的自由性而全部改为直角三角形,以此来提高效率
不知道各位听懂了没有……{/gg}
P.S.我是IamI,与上次一样,就不要出来什么set_point或者是Math::sin了 [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: Iselia雪    时间: 2008-3-9 20:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是我的马甲    时间: 2008-3-9 20:38
那啥……LS那是纯躲避这句话:
no Set_Point
算了,水水在不?问一下大概的原理是不是直接x差除以高度就可以得到每1y所地增减的x值,然后一条条描线,这样的话我自己去写好了……
再重复一遍我信奉的原则:
no point by point!
作者: 美兽    时间: 2008-3-9 20:40
一,确定顶点,
二,确定增量,
三,直线描绘.

最傻的方法. [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: 我是我的马甲    时间: 2008-3-9 20:42
那好吧,我讨厌逐点……除了这种傻法好像没有别的方法……
作者: Iselia雪    时间: 2008-3-9 20:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是我的马甲    时间: 2008-3-9 20:45
以下引用Iselia雪于2008-3-9 12:43:13的发言:

啊,我这个方法后面优化成了fill_rect。
比起确定增量不过多了三条线的描绘,描那三条线至多5帧,差不多了吧- -bbb

ORZ……生理年龄限制了思维。

LS说得真好……我一帧就要几十个三角形然后还要fill_rect……就5帧而已哦……好少好少的捏
还有在脚本里面清晰地看到了“作弊”二字……{/hx}
作者: Iselia雪    时间: 2008-3-9 20:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-9 20:50
以下引用我是我的马甲于2008-3-9 12:38:34的发言:

</script>那啥……LS那是纯躲避这句话:<br>
no Set_Point<br>
算了,水水在不?问一下大概的原理是不是直接x差除以高度就可以得到每1y所地增减的x值,然后一条条描线,这样的话我自己去写好了……<br>
再重复一遍我信奉的原则:<br>
no point by point!

是的~~~就是这样
记得要用浮点数来除...我第一次写的时候因为很傻地用了int....so....orz
还有就是,其实我好象在你帖子后边有发过改过的版本....
那个还是有问题吗?
作者: 美兽    时间: 2008-3-9 20:53
一次fill == 四次if,
一次增量 == 一次if.

另外不规则图形描绘可以有更好的方法.直角分解.

而按照LZ的要求,说句实话,一次放缩换算,加一次fill,就OK了.几乎可以与.blt等速.
作者: 我是我的马甲    时间: 2008-3-9 20:55
我要的是效率……效率很重要……
美兽殿如果有空就写一个吧,要多少赏金……(这个问题有点……)
作者: 水迭澜    时间: 2008-3-9 20:56
..............什么是直角分解?那不是做向量的灭?
意思是先画一个矩形之类的然后转换?
作者: 美兽    时间: 2008-3-9 20:56
以下引用我是我的马甲于2008-3-9 12:55:21的发言:

我要的是效率……效率很重要……
美兽殿如果有空就写一个吧,要多少赏金……(这个问题有点……)


抱歉,已经不玩RM,但我觉得思路说的已经很明确了.根据源三角进行放缩换算,很基本的空间换时间思想.
作者: 美兽    时间: 2008-3-9 20:57
以下引用水迭澜于2008-3-9 12:56:21的发言:

..............什么是直角分解?那不是做向量的灭?
意思是先画一个矩形之类的然后转换?


与那个不一样,任何不规则直线图形都可以进行直角三角的分解,记得在图形学会见到,不晓得你们是否学过,不过我没系统学过,属于后修的,所以用词上可能有点问题— —
作者: 我是我的马甲    时间: 2008-3-9 20:58
以下引用美兽于2008-3-9 12:56:35的发言:


以下引用我是我的马甲于2008-3-9 12:55:21的发言:

我要的是效率……效率很重要……
美兽殿如果有空就写一个吧,要多少赏金……(这个问题有点……)



抱歉,已经不玩RM,但我觉得思路说的已经很明确了.根据源三角进行放缩换算,很基本的空间换时间思想.

我才初二咩……矩阵知识凑合还行……既然“思路已经说得很明确”那就算掉了吧。

作者: 水迭澜    时间: 2008-3-9 20:59
没学过..俺不是计算机专业滴...只学了矩阵和空间向量的积分
那你说说具体做法可以吗
作者: 美兽    时间: 2008-3-9 21:00
以下引用水迭澜于2008-3-9 12:59:06的发言:

没学过..俺不是计算机专业滴...只学了矩阵和空间向量的积分
那你说说具体做法可以吗


我是哲学— —
你可以拿PS画个任意三角形,之后描出高线,仔细观察下,很容易出结果。
作者: 我是我的马甲    时间: 2008-3-9 21:02
以下引用美兽于2008-3-9 13:00:48的发言:


以下引用水迭澜于2008-3-9 12:59:06的发言:

没学过..俺不是计算机专业滴...只学了矩阵和空间向量的积分
那你说说具体做法可以吗



我是哲学— —
你可以拿PS画个任意三角形,之后描出高线,仔细观察下,很容易出结果。

好吧这是最基本的几何……我要的是直接画一个最最最基本的Rt三角形
作者: 水迭澜    时间: 2008-3-9 21:03
..........
那个,我知道
问题在于,RGSS里只能填充矩型吧?
作者: 美兽    时间: 2008-3-9 21:05
以下引用水迭澜于2008-3-9 13:03:13的发言:

..........
那个,我知道
问题在于,RGSS里只能填充矩型吧?


RUBY是程序,程序思想是一家,矩形也不过是默设的基础类型,你完全可以自己新建基础类型,例如JAVA,VB等就有三角与圆,实际最终的描绘也仅是放缩操作。

作者: 水迭澜    时间: 2008-3-9 21:07
{/lh}我明白了...
自己定义一个直角三角形,并且画出来,实际用到的时候就对它进行放缩操作?
这样会比较快咩.....?
作者: 美兽    时间: 2008-3-9 21:09
以下引用水迭澜于2008-3-9 13:07:56的发言:

我明白了...
自己定义一个直角三角形,并且画出来,实际用到的时候就对它进行放缩操作?
这样会比较快咩.....?


孺娘可教。
作者: 我是我的马甲    时间: 2008-3-9 21:09
问题是……Ruby中有Matrix操作吗……
作者: Iselia雪    时间: 2008-3-9 21:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是我的马甲    时间: 2008-3-9 21:17
以下引用Iselia雪于2008-3-9 13:13:46的发言:

如果是正直角,构建与xy轴相交的一个函数,再根据函数每一点对应值和X原点之间fill_rect.
不是正直角,最后还是要返回三个函数,求范围不会- -思路依然绕回我的方法。

这就是刚才被美兽殿说完全XX的方法……兽殿大概的意思是:
Init=〉Draw_Rt(bitmap)
update=>Matrix(bitmap)
      =>blt(bitmap)
上帝……我怎么忘了strech_blt……但是……相似比……我的天哪……
但是……貌似要定义4个角度的(90,180,270,360)……这样脚本就会非常复杂……
果然是……以空间换时间

作者: Iselia雪    时间: 2008-3-9 21:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 我是我的马甲    时间: 2008-3-9 21:34
我只需要正直角。思路已经得到,撤走,谢谢雪,余下的1分归你了……




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