C/C++ LS3/NS3 球体生成算法及实现
给定球体的中心及其半径,本任务旨在高效地生成计算机屏幕上显示球体所需的所有整数点(像素)。算法通过朴素弧创建体素来生成离散球体。NS3 代表通过平方和计算的朴素球体,LS3 代表通过平方和计算的格子球体。
算法原理
算法主要侧重于生成 prima quadraginta 的体素。将离散球体分割成 48 个部分时,会形成 prima quadraginta,所有 48 个部分都具有某种对称关系,并且都可以使用它的任何一个部分生成。该部分称为 prima quadraginta。类似地,quadraginta 八分圆的定义与 prima quadraginta 相同,只是它被分割成 8 个相等的部分而不是 48 个。quadraginta 八分圆包含 6 个 prima quadraginta。简单弧是 prima quadraginta 中具有相同 x 坐标的体素集。利用 48 对称性,可以从其原始四边形发展出整个离散球体。
使用 48 对称性的局限性在于 q 八分圆的一些体素会重复,因为它们与其他相邻的原始四边形共享边或体素。我们的算法会生成一些重复的体素,因此需要对输入的体素进行一些限制。为此,在实现中包含了一些函数来处理这些情况:
- putpixelone: 存储单个体素。
- putpixelmiddle: 处理恰好两个坐标值为 NULL 的点。
- putpixeldouble: 处理 y 和 z 坐标相同的体素集。
- putpixeledge2: 处理 x 和 y 坐标相同的体素集。
- putpixeledge1: 生成所有具有一个坐标零的体素。
- putpixelsingle: 处理位于四八分圆中间的体素。
- putpixelall: 使用 48 对称性生成除灰色体素之外的所有体素。
代码实现
#include <iostream>
#include <cmath>
#include <utility>
#include <list>
#include <map>
using namespace std;
// map to store the voxels
map<int, list<pair<int, int> > > mymap;
map<int, list<pair<int, int> > >::iterator itr;
// this function will store single voxel
void putpixelone(int m, n, p) {
mymap[m].((n, p));
}
{
(a + x, b + y, c + z);
(a + x, b + y, -c + z);
(a + x, c + y, b + z);
(a + x, -c + y, b + z);
(c + x, a + y, b + z);
(-c + x, a + y, b + z);
}
{
( j = ; j < ; j++) {
(a + x, b + y, c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(-a + x, b + y, c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(a + x, -b + y, c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(-a + x, -b + y, c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(a + x, b + y, -c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(-a + x, b + y, -c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(a + x, -b + y, -c + z);
(b, c);
(a, b);
}
( j = ; j < ; j++) {
(-a + x, -b + y, -c + z);
(b, c);
(a, b);
}
}
{
(a + x, b + y, c + z);
(-a + x, b + y, c + z);
(a + x, -b + y, c + z);
(-a + x, -b + y, c + z);
(a + x, b + y, -c + z);
(-a + x, b + y, -c + z);
(a + x, -b + y, -c + z);
(-a + x, -b + y, -c + z);
}
{
( j = ; j < ; j++) {
(a + x, b + y, c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(-a + x, b + y, c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(a + x, -b + y, c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(-a + x, -b + y, c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(a + x, b + y, -c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(-a + x, b + y, -c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(a + x, -b + y, -c + z);
(a, b);
(b, c);
}
( j = ; j < ; j++) {
(-a + x, -b + y, -c + z);
(a, b);
(b, c);
}
}
{
(a + x, b + y, c + z);
(a + x, c + y, b + z);
(a + x, -b + y, c + z);
(a + x, b + y, -c + z);
(a + x, -b + y, -c + z);
(a + x, -c + y, b + z);
(a + x, c + y, -b + z);
(a + x, -c + y, -b + z);
(b + x, c + y, a + z);
(b + x, a + y, c + z);
(b + x, -c + y, a + z);
(b + x, c + y, -a + z);
(b + x, -c + y, -a + z);
(b + x, a + y, -c + z);
(b + x, -a + y, c + z);
(b + x, -a + y, -c + z);
(c + x, a + y, b + z);
(c + x, -a + y, b + z);
(c + x, a + y, -b + z);
(c + x, -a + y, -b + z);
(c + x, b + y, a + z);
(c + x, -b + y, a + z);
(c + x, b + y, -a + z);
(c + x, -b + y, -a + z);
}
{
(a + x, b + y, c + z);
(b + x, a + y, c + z);
(c + x, b + y, a + z);
(a + x, c + y, b + z);
(c + x, a + y, b + z);
(b + x, c + y, a + z);
(-a + x, -b + y, c + z);
(-b + x, -a + y, c + z);
(c + x, -b + y, -a + z);
(-a + x, c + y, -b + z);
(c + x, -a + y, -b + z);
(-b + x, c + y, -a + z);
(a + x, -b + y, -c + z);
(-b + x, a + y, -c + z);
(-c + x, -b + y, a + z);
(a + x, -c + y, -b + z);
(-c + x, a + y, -b + z);
(-b + x, -c + y, a + z);
(-a + x, b + y, -c + z);
(b + x, -a + y, -c + z);
(-c + x, b + y, -a + z);
(-a + x, -c + y, b + z);
(-c + x, -a + y, b + z);
(b + x, -c + y, -a + z);
(-a + x, b + y, c + z);
(b + x, -a + y, c + z);
(c + x, b + y, -a + z);
(-a + x, c + y, b + z);
(c + x, -a + y, b + z);
(b + x, c + y, -a + z);
(a + x, -b + y, c + z);
(-b + x, a + y, c + z);
(c + x, -b + y, a + z);
(a + x, c + y, -b + z);
(c + x, a + y, -b + z);
(-b + x, c + y, a + z);
(a + x, b + y, -c + z);
(b + x, a + y, -c + z);
(-c + x, b + y, a + z);
(a + x, -c + y, b + z);
(-c + x, a + y, b + z);
(b + x, -c + y, a + z);
(-a + x, -b + y, -c + z);
(-b + x, -a + y, -c + z);
(-c + x, -b + y, -a + z);
(-a + x, -c + y, -b + z);
(-c + x, -a + y, -b + z);
(-b + x, -c + y, -a + z);
}
{
i = , j = ;
k0 = r;
k = k0;
s0 = ;
s = s0;
v0 = r - ;
v = v0;
l0 = * v0;
l = l0;
(i <= k) {
(j <= k) {
(s > v) {
k = k - ;
v = v + l;
l = l - ;
}
((j <= k) && ((s != v) || (j != k))) {
(i == && j != )
(i, j, k, x, y, z);
(i == j && j != k && i != )
(i, j, k, x, y, z);
(i == j && j == k)
(i, j, k, x, y, z);
(j == k && i < k && i < j)
(i, j, k, x, y, z);
(i == && j == )
(i, j, k, x, y, z);
(i, j, k, x, y, z);
}
s = s + * j + ;
j = j + ;
}
s0 = s0 + * i + ;
i = i + ;
((s0 > v0) && (i <= k0)) {
k0 = k0 - ;
v0 = v0 + l0;
l0 = l0 - ;
}
j = i;
k = k0;
v = v0;
l = l0;
s = s0;
}
}
{
count = ;
(itr = mymap.(); itr != mymap.(); ++itr) {
list<pair<, > > l = itr->second;
list<pair<, > >::iterator it;
(it = l.(); it != l.(); ++it) {
cout << itr->first << << <>(*it)
<< << <>(*it) << endl;
count += ;
}
}
cout << endl;
cout << count << endl;
}
{
cx, cy, cz;
cin >> cx >> cy >> cz;
r;
cin >> r;
(cx, cy, cz, r);
(mymap);
}


