计算圆锥体内的3D笛卡尔坐标

时间:2018-06-29 16:32:31

标签: c++

因此,我在这里基本上要做的是安排倒锥内点的3D笛卡尔坐标(半径随高度减小)。我在这里采用的基本方法是使高度h整体减小,并绘制落在以高度(x,y)形成的圆内的点h。由于该圆的半径是可变的,因此我使用一个简单的相似性条件来确定每次迭代。我采用的初始高度是1000,半径最初应该是3500。而且,这些圆以(0,0)为中心[z轴穿过圆锥的顶点,并且垂直于底面]。代码无法正常运行,显示退出状态为-1。有人可以帮我弄清楚我的实现是否由于某些大小错误或其他原因而关闭了?

#include<bits/stdc++.h>
#define ll long long int
using namespace std;

int main(){
    float top[1010][9000][3];
    ll i = 0;
    for(ll h = 999; h >=0; h--){
        float r=(h+1)*(3.5);
        for (ll x = floor(r) * (-1); x <= floor(r); x++){
            for (ll y = floor(r) *(-1); y <= floor(r); y++){
                if(pow(x,2) + pow(y,2) <= pow(floor(r),2)){
                    top[h][i][0] = x;
                    top[h][i][1] = y;
                    top[h][i][2] = 9.8;
                    i++;
                }
            }
        }
        i=0;
    }
    cout << "done";
    for (ll m = 0; m < 1000; m++){
        for(ll n = 0; n < 7000; n++){
            if(top[m][n][2] == 9.8){
                cout << top[m][n][0] << top[m][n][1];
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您无需将ll声明为long long int。您正在使用的索引将位于int内。

这是您的问题:将代码更改为此,以查看发生了什么:

for(ll h = 999; h >=0; h--){
    float r=(h+1)*(3.5);
    for (ll x = floor(r) * (-1); x <= floor(r); x++){
        for (ll y = floor(r) *(-1); y <= floor(r); y++){
            if(pow(x,2) + pow(y,2) <= pow(floor(r),2)){
                /* top[h][i][0] = x;
                top[h][i][1] = y;
                top[h][i][2] = 9.8; //*/
                i++; // this gets really big
            }
        }
    }
    cout << "max i: " << i << endl;
    i=0;
}

i确实很大,并且索引的尺寸只有9000。


对代码的批评...

看起来您正在扫描整个x,y,z块并“测试”该点是否在内部。如果是,请保存该点的x,y坐标以及9.8(某些字段值?)。

也许您可以放弃float缓冲区,而直接打印{x,y}坐标以查看代码的工作方式,然后再尝试保存输出。将输出重定向到文件并检查。

cout << "{" << x << "," << y <<"}," << (i % 5 == 0 ? "\n" : " ");

此外,请继续阅读为什么无法将浮点数与==进行比较。