作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用体素制作一个椭球体,我有一个实现,但它不能正常工作,在过去的几个小时里,我一直在尝试一些没有成功的事情。
其工作原理如下:
利用Bresenham圆算法绘制Z轴上的2D椭圆
它计算一个圆向前和一个圆对一个圆的坐标
它用这些坐标作为X和Y的半径
以下是有效的方法:
球体是完美的
当
z>x和z>y
x==y轴
以下是不需要的:
椭圆体当X!=年
当y>xhttp://postimage.org/image/gslvykrgd/
当x>y只翻转时也会发生同样的事情
我猜是因为我每次都是从中间到前面画切片,但我不知道。下面是我的实现,一团糟我很快清理了一下,所以在某种程度上可以理解另外,我正在为以后保存优化,我只希望它现在工作。
我不会展示圆算法本身的实现,因为我知道它是有效的,它只会使这个问题变得更长所以我来解释这两个函数。private List<Integer> getSlice(int rx, int ry)
从bresenham圆算法的运行中获得原始结果,不需要对称性。它以x,y结果的列表形式按该顺序返回结果。public void generateEllipse(int z, int cx, int cy, int cz, int rx, int ry)
使用给定的信息生成一个椭圆,并使用对称性绘制坐标,这些将在屏幕上呈现。
ArrayList<Integer> s = getSlice(rz, rx);
ArrayList<Integer> s2 = getSlice(rz, ry);
int cap = Math.max(s2.size(), s.size());
while (s.size() > 1)
{
int x = 0;
int z = 0;
int z2 = 0;
int y2 = 0;
int i = cap - 2;
if (s.size() > i)
{
z = s.get(i);
x = s.get(i + 1);
s.remove(i + 1);
s.remove(i);
}
if (s2.size() > i)
{
z2 = s2.get(i);
y2 = s2.get(i + 1);
s2.remove(i + 1);
s2.remove(i);
}
if (x != 0 && y2 != 0)
generateEllipse(z, cx, cy, cz, x, y2);
cap = Math.max(s2.size(), s.size());
else if (y2 < x && ry - y2 != 0)
generateEllipse(z, cx, cy, cz, x, ry - y2);
|| r - y2 == 0
到底部的第一个测试。
getSlice(...)
的列表中。
while(!s.isEmpty())
并在循环外定义两个新值:
incX = s.size
和
incY = s1.size
我测试它们的z值是否匹配,如果不匹配,那么我会更正它。我想我会得到这些值,测试最大的列表,如果它们不匹配,那么将最小列表的inc值减2,得到旧的值。
!s.isEmpty()
,因为这两个列表将同时为空同时画椭圆,我将使用任意一个z值,因为它们应该相等。
最佳答案
感谢查看此内容的所有人(即使没有收到任何答复:),我正在设置此答案,因为问题已解决,代码如下:
ArrayList<Integer> s = getSlice(rz, rx);
ArrayList<Integer> s2 = getSlice(rz, ry);
boolean yMax = Math.max(s2.size(), s.size()) == s2.size();
int decX = s.size() - 1;
int decY = s2.size() - 1;
boolean done = false;
while (!done)
{
int x = 0;
int z = 0;
int z2 = 0;
int y = 0;
y = s2.get(decY--);
z2 = s2.get(decY--);
x = s.get(decX--);
z = s.get(decX--);
if (z != z2)
{
if (yMax)
{
decX += 2;
x = s.get(decX);
s2.remove(decY + 2);
s2.remove(decY + 1);
}
else
{
decY += 2;
y = s2.get(decY);
s.remove(decX + 2);
s.remove(decX + 1);
}
z = z < z2 ? z : z2;
}
else
{
s.remove(decX + 2);
s.remove(decX + 1);
s2.remove(decY + 2);
s2.remove(decY + 1);
}
if (y != 0 && x != 0)
generateEllipse(z, cx, cy, cz, x, y);
done = yMax ? s2.isEmpty() : s.isEmpty();
}
关于java - 布雷森汉姆3d椭球问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016002/
我是一名优秀的程序员,十分优秀!