#include\x20\n#include\x20\n\nusing\x20namespace\x20std;\n\nconst\x20double\x20EPSILON\x20=\x201e-6;\x20//\x20精度误差\n\nclass\x20Point\x20{\nprivate:\n\x20double\x20x;\n\x20double\x20y;\n\x20double\x20z;\n\npublic:\n\x20Point(double\x20x,\x20double\x20y,\x20double\x20z)\x20{\n\x20\x20this->x\x20=\x20x;\n\x20\x20this->y\x20=\x20y;\n\x20\x20this->z\x20=\x20z;\n\x20}\n\n\x20double\x20getX()\x20const\x20{\n\x20\x20return\x20x;\n\x20}\n\n\x20double\x20getY()\x20const\x20{\n\x20\x20return\x20y;\n\x20}\n\n\x20double\x20getZ()\x20const\x20{\n\x20\x20return\x20z;\n\x20}\n};\n\nclass\x20Line\x20{\nprivate:\n\x20Point\x20p1;\n\x20Point\x20p2;\n\npublic:\n\x20Line(Point\x20p1,\x20Point\x20p2)\x20{\n\x20\x20this->p1\x20=\x20p1;\n\x20\x20this->p2\x20=\x20p2;\n\x20}\n\n\x20double\x20getDistance()\x20const\x20{\n\x20\x20double\x20dx\x20=\x20p2.getX()\x20-\x20p1.getX();\n\x20\x20double\x20dy\x20=\x20p2.getY()\x20-\x20p1.getY();\n\x20\x20double\x20dz\x20=\x20p2.getZ()\x20-\x20p1.getZ();\n\x20\x20return\x20sqrt(dx\x20*\x20dx\x20+\x20dy\x20*\x20dy\x20+\x20dz\x20*\x20dz);\n\x20}\n\n\x20Point\x20getP1()\x20const\x20{\n\x20\x20return\x20p1;\n\x20}\n\n\x20Point\x20getP2()\x20const\x20{\n\x20\x20return\x20p2;\n\x20}\n};\n\nclass\x20Plane\x20{\nprivate:\n\x20double\x20a;\n\x20double\x20b;\n\x20double\x20c;\n\x20double\x20d;\n\npublic:\n\x20Plane(double\x20a,\x20double\x20b,\x20double\x20c,\x20double\x20d)\x20{\n\x20\x20this->a\x20=\x20a;\n\x20\x20this->b\x20=\x20b;\n\x20\x20this->c\x20=\x20c;\n\x20\x20this->d\x20=\x20d;\n\x20}\n\n\x20double\x20getDistance(Point\x20p)\x20const\x20{\n\x20\x20double\x20numerator\x20=\x20a\x20*\x20p.getX()\x20+\x20b\x20*\x20p.getY()\x20+\x20c\x20*\x20p.getZ()\x20+\x20d;\n\x20\x20double\x20denominator\x20=\x20sqrt(a\x20*\x20a\x20+\x20b\x20*\x20b\x20+\x20c\x20*\x20c);\n\x20\x20return\x20fabs(numerator\x20/\x20denominator);\n\x20}\n\n\x20double\x20getUnitNormalVectorX()\x20const\x20{\n\x20\x20return\x20a\x20/\x20sqrt(a\x20*\x20a\x20+\x20b\x20*\x20b\x20+\x20c\x20*\x20c);\n\x20}\n\n\x20double\x20getUnitNormalVectorY()\x20const\x20{\n\x20\x20return\x20b\x20/\x20sqrt(a\x20*\x20a\x20+\x20b\x20*\x20b\x20+\x20c\x20*\x20c);\n\x20}\n\n\x20double\x20getUnitNormalVectorZ()\x20const\x20{\n\x20\x20return\x20c\x20/\x20sqrt(a\x20*\x20a\x20+\x20b\x20*\x20b\x20+\x20c\x20*\x20c);\n\x20}\n};\n\n//\x20判断两个实数是否相等\nbool\x20isEqual(double\x20a,\x20double\x20b)\x20{\n\x20return\x20fabs(a\x20-\x20b)\x20<\x20EPSILON;\n}\n\n//\x20判断两个点是否相等\nbool\x20isEqual(Point\x20p1,\x20Point\x20p2)\x20{\n\x20return\x20isEqual(p1.getX(),\x20p2.getX())\x20&&\x20isEqual(p1.getY(),\x20p2.getY())\x20&&\x20isEqual(p1.getZ(),\x20p2.getZ());\n}\n\n//\x20判断点和直线的关系\nbool\x20isPointOnLine(Point\x20p,\x20Line\x20l)\x20{\n\x20double\x20dx1\x20=\x20p.getX()\x20-\x20l.getP1().getX();\n\x20double\x20dy1\x20=\x20p.getY()\x20-\x20l.getP1().getY();\n\x20double\x20dz1\x20=\x20p.getZ()\x20-\x20l.getP1().getZ();\n\x20double\x20dx2\x20=\x20p.getX()\x20-\x20l.getP2().getX();\n\x20double\x20dy2\x20=\x20p.getY()\x20-\x20l.getP2().getY();\n\x20double\x20dz2\x20=\x20p.getZ()\x20-\x20l.getP2().getZ();\n\x20return\x20isEqual(dx1\x20*\x20dx2\x20+\x20dy1\x20*\x20dy2\x20+\x20dz1\x20*\x20dz2,\x200);\n}\n\n//\x20判断线和线的关系\nbool\x20isLineIntersect(Line\x20l1,\x20Line\x20l2)\x20{\n\x20double\x20x1\x20=\x20l1.getP1().getX();\n\x20double\x20y1\x20=\x20l1.getP1().getY();\n\x20double\x20z1\x20=\x20l1.getP1().getZ();\n\x20double\x20x2\x20=\x20l1.getP2().getX();\n\x20double\x20y2\x20=\x20l1.getP2().getY();\n\x20double\x20z2\x20=\x20l1.getP2().getZ();\n\x20double\x20x3\x20=\x20l2.getP1().getX();\n\x20double\x20y3\x20=\x20l2.getP1().getY();\n\x20double\x20z3\x20=\x20l2.getP1().getZ();\n\x20double\x20x4\x20=\x20l2.getP2().getX();\n\x20double\x20y4\x20=\x20l2.getP2().getY();\n\x20double\x20z4\x20=\x20l2.getP2().getZ();\n\n\x20double\x20denominator\x20=\x20(y1\x20-\x20y2)\x20*\x20(z3\x20-\x20z4)\x20-\x20(z1\x20-\x20z2)\x20*\x20(y3\x20-\x20y4);\n\x20double\x20numerator1\x20=\x20(x1\x20-\x20x3)\x20*\x20((y1\x20-\x20y2)\x20*\x20(z3\x20-\x20z4)\x20-\x20(z1\x20-\x20z2)\x20*\x20(y3\x20-\x20y4))\x20-\x20(x1\x20-\x20x2)\x20*\x20((y1\x20-\x20y3)\x20*\x20(z3\x20-\x20z4)\x20-\x20(z1\x20-\x20z3)\x20*\x20(y3\x20-\x20y4));\n\x20double\x20numerator2\x20=\x20(x1\x20-\x20x3)\x20*\x20((x1\x20-\x20x2)\x20*\x20(z3\x20-\x20z4)\x20-\x20(z1\x20-\x20z2)\x20*\x20(x3\x20-\x20x4))\x20-\x20(x1\x20-\x20x2)\x20*\x20((x1\x20-\x20x3)\x20*\x20(z3\x20-\x20z4)\x20-\x20(z1\x20-\x20z3)\x20*\x20(x3\x20-\x20x4));\n\x20double\x20numerator3\x20=\x20(x1\x20-\x20x2)\x20*\x20((x1\x20-\x20x3)\x20*\x20(y1\x20-\x20y2)\x20-\x20(y1\x20-\x20y3)\x20*\x20(x3\x20-\x20x4))\x20-\x20(y1\x20-\x20y2)\x20*\x20((x1\x20-\x20x3)\x20*\x20(x1\x20-\x20x2)\x20-\x20(x1\x20-\x20x3)\x20*\x20(y1\x20-\x20y2));\n\n\x20if\x20(isEqual(denominator,\x200))\x20{\n\x20\x20//\x20平行或共线\n\x20\x20if\x20(isEqual(numerator1,\x200)\x20&&\x20isEqual(numerator2,\x200)\x20&&\x20isEqual(numerator3,\x200))\x20{\n\x20\x20\x20return\x20true;\x20//\x20共线\n\x20\x20}else\x20{\n\x20\x20\x20return\x20false;\x20//\x20平行\n\x20\x20}\n\x20}else\x20{\n\x20\x20double\x20t\x20=\x20numerator1\x20/\x20denominator;\n\x20\x20double\x20s\x20=\x20numerator2\x20/\x20denominator;\n\x20\x20double\x20r\x20=\x20numerator3\x20/\x20denominator;\n\x20\x20return\x20(t\x20>=\x200\x20&&\x20t\x20<=\x201)\x20&&\x20(s\x20>=\x200\x20&&\x20s\x20<=\x201)\x20&&\x20(r\x20>=\x200\x20&&\x20r\x20<=\x201);\n\x20}\n}\n\n//\x20判断点和平面的关系\nbool\x20isPointOnPlane(Point\x20p,\x20Plane\x20plane)\x20{\n\x20double\x20dx\x20=\x20p.getX();\n\x20double\x20dy\x20=\x20p.getY();\n\x20double\x20dz\x20=\x20p.getZ();\n\x20double\x20a\x20=\x20plane.getUnitNormalVectorX();\n\x20double\x20b\x20=\x20plane.getUnitNormalVectorY();\n\x20double\x20c\x20=\x20plane.getUnitNormalVectorZ();\n\x20double\x20d\x20=\x20plane.getDistance(p);\n\n\x20return\x20isEqual(a\x20*\x20dx\x20+\x20b\x20*\x20dy\x20+\x20c\x20*\x20dz\x20+\x20d,\x200);\n}\n\n//\x20判断线和平面的关系\nbool\x20isLineIntersectPlane(Line\x20line,\x20Plane\x20plane)\x20{\n\x20Point\x20p1\x20=\x20line.getP1();\n\x20Point\x20p2\x20=\x20line.getP2();\n\x20double\x20dx1\x20=\x20p1.getX();\n\x20double\x20dy1\x20=\x20p1.getY();\n\x20double\x20dz1\x20=\x20p1.getZ();\n\x20double\x20dx2\x20=\x20p2.getX();\n\x20double\x20dy2\x20=\x20p2.getY();\n\x20double\x20dz2\x20=\x20p2.getZ();\n\x20double\x20a\x20=\x20plane.getUnitNormalVectorX();\n\x20double\x20b\x20=\x20plane.getUnitNormalVectorY();\n\x20double\x20c\x20=\x20plane.getUnitNormalVectorZ();\n\x20double\x20d\x20=\x20plane.getDistance(p1);\n\x20double\x20denominator\x20=\x20a\x20*\x20(dx1\x20-\x20dx2)\x20+\x20b\x20*\x20(dy1\x20-\x20dy2)\x20+\x20c\x20*\x20(dz1\x20-\x20dz2);\n\n\x20if\x20(isEqual(denominator,\x200))\x20{\n\x20\x20//\x20平行或共面\n\x20\x20if\x20(isPointOnPlane(p1,\x20plane))\x20{\n\x20\x20\x20return\x20true;\x20//\x20共面\n\x20\x20}else\x20{\n\x20\x20\x20return\x20false;\x20//\x20平行\n\x20\x20}\n\x20}else\x20{\n\x20\x20double\x20t\x20=\x20(a\x20*\x20dx1\x20+\x20b\x20*\x20dy1\x20+\x20c\x20*\x20dz1\x20+\x20d)\x20/\x20denominator;\n\x20\x20return\x20t\x20>=\x200\x20&&\x20t\x20<=\x201;\n\x20}\n}\n\n//\x20判断平面和平面的关系\nbool\x20isPlaneIntersect(Plane\x20plane1,\x20Plane\x20plane2)\x20{\n\x20double\x20a1\x20=\x20plane1.getUnitNormalVectorX();\n\x20double\x20b1\x20=\x20plane1.getUnitNormalVectorY();\n\x20double\x20c1\x20=\x20plane1.getUnitNormalVectorZ();\n\x20double\x20d1\x20=\x20plane1.getDistance(Point(0,\x200,\x200));\n\x20double\x20a2\x20=\x20plane2.getUnitNormalVectorX();\n\x20double\x20b2\x20=\x20plane2.getUnitNormalVectorY();\n\x20double\x20c2\x20=\x20plane2.getUnitNormalVectorZ();\n\x20double\x20d2\x20=\x20plane2.getDistance(Point(0,\x200,\x200));\n\n\x20double\x20denominator\x20=\x20a1\x20*\x20b2\x20-\x20a2\x20*\x20b1;\n\x20double\x20numerator1\x20=\x20b1\x20*\x20d2\x20-\x20b2\x20*\x20d1;\n\x20double\x20numerator2\x20=\x20a2\x20*\x20d1\x20-\x20a1\x20*\x20d2;\n\n\x20if\x20(isEqual(denominator,\x200))\x20{\n\x20\x20//\x20平行或共面\n\x20\x20if\x20(isEqual(numerator1,\x200)\x20&&\x20isEqual(numerator2,\x200))\x20{\n\x20\x20\x20return\x20true;\x20//\x20共面\n\x20\x20}else\x20{\n\x20\x20\x20return\x20false;\x20//\x20平行\n\x20\x20}\n\x20}else\x20{\n\x20\x20return\x20true;\n\x20}\n}\n\nint\x20main()\x20{\n\x20Point\x20p1(1,\x202,\x203);\n\x20Point\x20p2(4,\x205,\x206);\n\x20Line\x20line(p1,\x20p2);\n\x20cout\x20<<\x20"Distance\x20between\x20p1\x20and\x20p2:\x20"\x20<<\x20line.getDistance()\x20<<\x20endl;\n\n\x20Point\x20p3(7,\x208,\x209);\n\x20Plane\x20plane(1,\x202,\x203,\x204);\n\x20cout\x20<<\x20"Distance\x20between\x20p3\x20and\x20plane:\x20"\x20<<\x20plane.getDistance(p3)\x20<<\x20endl;\n\n\x20cout\x20<<\x20"Unit\x20normal\x20vector\x20of\x20the\x20plane:\x20("\x20<<\x20plane.getUnitNormalVectorX()\x20<<\x20",\x20"\x20<<\x20plane.getUnitNormalVectorY()\x20<<\x20",\x20"\x20<<\x20plane.getUnitNormalVectorZ()\x20<<\x20")"\x20<<\x20endl;\n\n\x20Point\x20p4(1,\x202,\x203);\n\x20cout\x20<<\x20"Is\x20p4\x20on\x20the\x20line?\x20"\x20<<\x20(isPointOnLine(p4,\x20line)\x20?\x20"Yes"\x20:\x20"No")\x20<<\x20endl;\n\n\x20Line\x20line2(p1,\x20p3);\n\x20cout\x20<<\x20"Do\x20line\x20and\x20line2\x20intersect?\x20"\x20<<\x20(isLineIntersect(line,\x20line2)\x20?\x20"Yes"\x20:\x20"No")\x20<<\x20endl;\n\n\x20cout\x20<<\x20"Is\x20p4\x20on\x20the\x20plane?\x20"\x20<<\x20(isPointOnPlane(p4,\x20plane)\x20?\x20"Yes"\x20:\x20"No")\x20<<\x20endl;\n\n\x20cout\x20<<\x20"Does\x20line\x20intersect\x20the\x20plane?\x20"\x20<<\x20(isLineIntersectPlane(line,\x20plane)\x20?\x20"Yes"\x20:\x20"No")\x20<<\x20endl;\n\n\x20Plane\x20plane2(2,\x203,\x204,\x205);\n\x20cout\x20<<\x20"Do\x20plane\x20and\x20plane2\x20intersect?\x20"\x20<<\x20(isPlaneIntersect(plane,\x20plane2)\x20?\x20"Yes"\x20:\x20"No")\x20<<\x20endl;\n\n\x20return\x200;\n

C++ 三维解析几何:点、线、面类实现与关系判定

原文地址: https://www.cveoy.top/t/topic/qfEz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录