所以,我有两个类,Point 和 Triangle,后者有三个 Point 成员。我想验证两个三角形之间的相似性。
这是我想出的代码:
三角形.h:
class Triunghi
{
public:
Punct *A, *B, *C;
....
点.cpp:
double Point::distance(Point& a){
return sqrt((X - a.X)*(X - a.X) + (Y - a.Y)*(Y - a.Y));
}
三角形.cpp:
double Triangle::sideAB(){
return A->distance(*B);
}
//same thing for sideAC(), sideBC()
bool Triangle::similar(Triangle& tr){
double a[3] = { sideBC(),
sideAC(),
sideAB() };
double b[3] = { tr.sideBC(),
tr.sideAC(),
tr.sideAB() };
sort(a, a + 3);
sort(b, b + 3);
double aux1 = a[0] / b[0], aux2 = a[1] / b[1], aux3 = a[2] / b[2];
if (aux1 == aux2 && aux2 == aux3) return true;
return false;
}
代码有效,但用于: 三角形 1:A(1,0) B(0,1) C(0,0) 三角形 2:A(3,0) B(0,3) C(0,0)
它说三角形不相似。我知道这是因为我使用的是 double 等等。 我尝试了乘法:
if(a[0]*b[1] == a[1]*b[0] && a[2]*b[1]==a[1]*b[2]) return true;
没用,同样的问题。 还尝试比较角度;没用。
还有其他想法吗?我知道我可以使用 trunc() 并且我认为它可能有效,但我想知道是否有更聪明的方法来执行此操作。
谢谢!
最佳答案
当您处理浮点值时,您通常不想测试相等性。几乎在所有情况下,你更关心“近似相等”。虽然 C++ 中没有“近似等于”运算符,但您可以模拟它。您只需要查看这些值是否足够接近。请参阅 std::numeric_limits::epsilon
的示例用于可能的实现。
关于c++ - 三角形之间的相似性;双变量是一个痛苦的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205301/