Exemplo n.º 1
0
bool Collide( float p[6] ){
	/*p[6]是一个盒子,必须是p[0]<p[3] p[1]<p[4] p[2]<p[5]
		等于是取得空间中一个盒子区域里面的三角平面
	*/
	float box[6];
	box[0] = min(p[0],p[3]);
	box[3] = max(p[0],p[3]);
	box[1] = min(p[1],p[4]);
	box[4] = max(p[1],p[4]);
	box[2] = min(p[2],p[5]);
	box[5] = max(p[2],p[5]);
	if( HitWrap(box,&g_collide,0x100111,0) != 0 ){
		/*
		{
			g_Render.Begin("test_ray");
			g_Render.Color(1,1,0);
			g_Render.MoveTo( p[0],p[1],p[2] );
			g_Render.LineTo( p[3],p[4],p[5] );
			g_Render.End();

			g_Render.Begin("test_triangle");
			g_Render.Color(1,0,0);
			g_Render.LineWidth(3);
			for( int i = 0;i < g_collide.iDownCount;i++ ){
				g_Render.MoveTo( g_collide.pDowns[i].a[0],g_collide.pDowns[i].a[1],g_collide.pDowns[i].a[2] );
				g_Render.LineTo( g_collide.pDowns[i].b[0],g_collide.pDowns[i].b[1],g_collide.pDowns[i].b[2] );
				g_Render.LineTo( g_collide.pDowns[i].c[0],g_collide.pDowns[i].c[1],g_collide.pDowns[i].c[2] );
			}
			g_Render.End();
		}*/
	//	g_Render.Begin("test_triangle");
	//	g_Render.Color(1,0,0);
	//	g_Render.LineWidth(3);
		for( int i = 0;i < g_collide.iDownCount;i++ ){
			if( IsInTriangle( &g_collide.pDowns[i],p ) ){
	//			g_Render.MoveTo( g_collide.pDowns[i].a[0],g_collide.pDowns[i].a[1],g_collide.pDowns[i].a[2] );
	//			g_Render.LineTo( g_collide.pDowns[i].b[0],g_collide.pDowns[i].b[1],g_collide.pDowns[i].b[2] );
	//			g_Render.LineTo( g_collide.pDowns[i].c[0],g_collide.pDowns[i].c[1],g_collide.pDowns[i].c[2] );
	//			g_Render.LineTo( g_collide.pDowns[i].a[0],g_collide.pDowns[i].a[1],g_collide.pDowns[i].a[2] );
	//			float t = CalcPlanePoint(g_collide.pDowns[i].n,p);
	//			float pp[3];
	//			pp[0] = (p[3]-p[0])*t+p[0];
	//			pp[1] = (p[4]-p[1])*t+p[1];
	//			pp[2] = (p[5]-p[2])*t+p[2];
	//			g_Render.Size(0.2);
	//			g_Render.Box(pp[0],pp[1],pp[2]);
	//			printf("%f %f %f %f\n",g_collide.pDowns[i].n[0],g_collide.pDowns[i].n[1],g_collide.pDowns[i].n[2],g_collide.pDowns[i].n[3] );
	//			g_Render.End();
				return true;
			}
		}
	//		g_Render.End();
	}
	return false;
}
bool CMy2DObjectB11::IsInside(double x, double y) {
    double new_x, new_y, tmp, new_x1, new_y1, new_x2, new_y2;
    // перенос
    x -= this->m_center.GetX();
    y -= this->m_center.GetY();

    // поворот
    new_x1 = x * cos(this->m_dAngle) - y * sin(this->m_dAngle);
    new_y1 = x * sin(this->m_dAngle) + y * cos(this->m_dAngle);

    // поворот на 90
    new_x2 = new_x1 * cos(M_PI / 2) - new_y1 * sin(M_PI / 2);
    new_y2 = new_x1 * sin(M_PI / 2) + new_y1 * cos(M_PI / 2);

    // смена осей координат
    tmp = new_x2;
    new_x = new_y2;
    new_y = tmp;


    // проверка на выход за границы фигуры по оси X
    if (new_x > (this->A / 2) || new_x < -(this->A / 2)) {
        return false;
    }
    // проверка на выход за границы фигуры по оси Y
    if (new_y >(this->A / 2) || new_y < -(this->A / 2)) {
        return false;
    }

    // проверка на выход за прямоугольник A1
    if ((new_x > this->A / 2 - this->A1) &&
        (-this->A1 / 2 < new_y) && (new_y < this->A1 / 2)) {
        return false;
    }

    // проверка на выход за треугольник A2
    bool isInA2Square =
        (-this->A / 2 <= new_x && new_x <= -this->A / 2 + this->A2) &&
        (this->A / 2 - this->A2 <= new_y && new_y <= this->A / 2);
    if (isInA2Square) {
        bool isInInnerA2Triangle = IsInTriangle(
            CMy2DPoint(-this->A / 2 + this->A2, this->A / 2),
            CMy2DPoint(-this->A / 2 + this->A2, this->A / 2 - this->A2),
            CMy2DPoint(-this->A / 2, this->A / 2 - this->A2),
            CMy2DPoint(new_x, new_y));
        if (!isInInnerA2Triangle) {
            return false;
        }
    }

    // проверка на выход за треугольник A3
    bool isInA3Square =
        (-this->A / 2 <= new_x && new_x <= -this->A / 2 + this->A3) &&
        (-this->A / 2 <= new_y && new_y <= -this->A / 2 + this->A3);
    if (isInA3Square) {
        bool isInnerA3Triangle = IsInTriangle(
            CMy2DPoint(-this->A / 2, -this->A / 2 + this->A3),
            CMy2DPoint(-this->A / 2 + this->A3, -this->A / 2 + this->A3),
            CMy2DPoint(-this->A / 2 + this->A3, -this->A / 2),
            CMy2DPoint(new_x, new_y));
        if (!isInnerA3Triangle) {
            return false;
        }
    }

    // все проверки прошли успешно, точка внутри фигуры.
    return true;
}