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; }