问题 E: 立方体碰撞检测(复合类+动态对象数组+析构)

问题 E: 立方体碰撞检测(复合类+动态对象数组+析构)

时间限制: 1 Sec  内存限制: 128 MB
提交: 355  解决: 200
[提交][状态][讨论版]

题目描述

假设坐标系采用下图中的三维坐标系(x,y,z),圆点为(0,0,0)。

定义点类CPoint,包含数据成员x坐标,y坐标,z坐标。方法有:带参构造函数,析构函数等。

假设立方体的边与坐标轴平行。定义立方体类CCube,包含数据成员:CPoint *point。方法有:

 

带参构造函数动态生成点对象数组,数组大小为2。并根据参数设置立方体的坐标点1,坐标点2,如上图所示。

int collide(CCube r);  判定与r立方体是否发生碰撞。碰撞返回1,否则返回0。

析构函数,释放分配的空间。

可根据需要,为CPoint和CCube添加需要的方法。

输入

测试次数t

每组测试数据两行:

第一行:第一个立方体的坐标点1、坐标点2

第二行:第二个立方体的坐标点1、坐标点2

 

输出

对每组测试数据,输出结果:

碰撞输出:collide; 否则输出:have distance

样例输入

2

7 7 10 10 10 7

7 8 12 11 12 8

-1 -1 8 6 6 1

-10 -10 10 -8 -8 8

样例输出

collide

have distance

 

 

贴代码:

//样例输入
//2
//7 7 10 10 10 7
//7 8 12 11 12 8
//-1 -1 8 6 6 1
//-10 -10 10 -8 -8 8
//
//样例输出
//collide
//have distance
#include 
#include 
using namespace std;
class CPoint{
    double x,y,z;
public:
    CPoint(){

    }
    CPoint(double x,double y,double z){
        this->x=x;
        this->y=y;
        this->z=z;
    }
    ~CPoint(){

    }
    friend class CCube;

};
class CCube{
private:
    CPoint *point;

public:
    CCube(double x1,double y1,double z1,double x2,double y2,double z2){
        point=(CPoint *)operator new(sizeof(CPoint)*2);
        point[0]=CPoint(x1,y1,z1);
        point[1]=CPoint(x2,y2,z2);
    }
    ~CCube(){
        for (int i = 0; i <2 ; ++i) {
            point[i].~CPoint();
        }
        operator delete(point);
    }

    int function(CCube & c){
        //求出几何中心点
        double x1=(point[0].x+point[1].x)/2;
        double y1=(point[0].y+point[1].y)/2;
        double z1=(point[0].z+point[1].z)/2;
        //同理
        double x2=(c.point[0].x+c.point[1].x)/2;
        double y2=(c.point[0].y+c.point[1].y)/2;
        double z2=(c.point[0].z+c.point[1].z)/2;



        //抽象出一个半边长的属性
        double half1=abs(point[0].x - c.point[1].x)/2;
        double half2=abs(c.point[0].x - c.point[1].x)/2;
        double julix=half1+half2;

        half1=abs(point[0].y - c.point[1].y)/2;
        half2=abs(c.point[0].y - c.point[1].y)/2;
        double juliy=half1+half2;

        half1=abs(point[0].z - c.point[1].z)/2;
        half2=abs(c.point[0].z - c.point[1].z)/2;
        double juliz=half1+half2;

//        cout<<"abs(x1-x2):"<>t;
    while(t--){
        CCube *cube=(CCube *)operator new(sizeof(CCube )*2);
        for (int i = 0; i < 2; ++i) {
            double x1;double y1;double z1;double x2;double y2;double z2;
            cin>>x1>>y1>>z1>>x2>>y2>>z2;
            new(&cube[i])CCube(x1,y1,z1,x2,y2,z2);
//注意当使用(Ccube *)operator new 来分配空间的时候
//需要使用new(&cube[i])CCube 来构造对象并且强制转换
//这行代码会得到错误的结果
//            cube[i]=CCube(x1,y1,z1,x2,y2,z2);
  
        }
        //上面生成了两个立方体
        //接下来在一个立方体的函数里面传另外一个立方体
        int ifis=cube[0].function(cube[1]);
        if (ifis==1) {
            cout<<"collide"<

 

 

 

 

你可能感兴趣的:(C++)