程序化生成三角形

  1. 分析世界坐标,找出世界坐标的X轴的Y轴及其正负方向;
  2. 获取世界坐标系下的单位长度大小,以供后续绘制三角形使用;
  3. 利用世界坐标系下的单位长度大小,定义三角形的三个顶点,若需要将斜边放置在轴上,则采用勾股定理求出斜边长度并对其顶点坐标进行设定即可;
  4. 使用相关API绘制三个顶点所定义的三角形;
  5. 添加三角形三个顶点在三角形自身局部坐标系下的缩放系数,并将其定义为公共参数;
  6. 添加三角形三个顶点在三角形自身局部坐标系下的偏移系数,并将其定义为公共参数;(也可根据世界坐标系下三角形生成的位置对其加以移动,缩放亦然);
  7. 使用偏移参数将生成的三角形放置在父物体的特定部位,比如:边缘处;
  8. 针对局部坐标系下三角形的自转,可直接设置其旋转角度;
  9. 然而,为使三角形能够跟着其父物体一同旋转的同时还绕着父物体公转,每次旋转时对三角形的位置进行重新设定,使用如下数学公式修正三角形的位置[theta为旋转角度,注意使用弧度制]:
RelativeLocation.x = (originalPosX - parentPosX) * math.cos(math.rad(theta)) - (originalPosY - parentPosY) * math.sin(math.rad(theta)) + parentPosX RelativeLocation.y = (originalPosX - parentPosX) * math.sin(math.rad(theta)) + (originalPosY - parentPosY) * math.cos(math.rad(theta)) + parentPosY --RelativeLocation.z = SOME_VALUE
  1. 生成多个三角形,可以选择直接在一边生成的方式,此时可以构建等差数列an=a1+(n-1)*d,其中,a1为初始的偏移参数,d为每个三角形之间的间距,an将作为累加的偏移项作用于每个生成的三角形上:
local sizeFactor = 1 --缩放倍率 local p1 = {x = -sizeFactor*(math.sqrt(2))*ONE, y = 0, z = 0} local p2 = {x = 0, y = 0, z = 0} local p3 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE, y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0} local a1, d = 0, (math.sqrt(2)*ONE+interval) --构建等差数列: an = a1 + (n-1)*d for i = 1, count do local an = (i-1)*d local A = {x = p1.x - an, y = p1.y, z = 0} local B = {x = p2.x - an, y = p2.y, z = 0} local C = {x = p3.x - an, y = p3.y, z = 0} DrawTriangle(A, B, C) end
  1. 生成多个三角形也可以选择在两边生成的方式:
local sizeFactor = 1 --缩放倍率 local p1 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE, y = 0, z = 0} local p2 = {x = sizeFactor*(math.sqrt(2)/2)*ONE, y = 0, z = 0} local p3 = {x = 0, y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0} local a1, d = 0, (math.sqrt(2)*ONE+interval) --构建等差数列: an = a1 + (n-1)*d local CreateTriangleOnSide = function(side) for i = 1, math.floor(count/2) do local an = i*d*side local A = {x = p1.x - an, y = p1.y, z = 0} local B = {x = p2.x - an, y = p2.y, z = 0} local C = {x = p3.x - an, y = p3.y, z = 0} DrawTriangle(A, B, C) end end --中间生成一个,然后两边分别生成-- local SIDE = {LEFT = -1, RIGHT = 1} --生成左右两边专用枚举 DrawTriangle(p1, p2, p3) CreateTriangleOnSide(SIDE.LEFT) CreateTriangleOnSide(SIDE.RIGHT)




作者:艾孜尔江·艾尔斯兰
转载或使用请务必标明出处


__EOF__

本文作者艾孜尔江
本文链接https://www.cnblogs.com/ezhar/p/16064233.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   艾孜尔江  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2021-03-27 网站底部放置备案号
点击右上角即可分享
微信分享提示