c++ - 三角形之间的相似性;双变量是一个痛苦的

标签 c++ geometry

所以,我有两个类,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/

相关文章:

c++ - 模板类型的值,如 std::false_type

java - 两个矩形是否相互重叠?

python - 如何使用直骨架计算多边形的斜接偏移

c++ - Cython 映射 c++ 数据结构

c++ - 具有内部和外部链接的内联函数与编译器优化之间有什么实际区别吗?

c++ - 有人能解释一下这段代码是如何执行的吗?

algorithm - 找到具有最大 top-K 点总和的区域

r - 点矩阵之间的距离,简单的 if 和 for

javascript - ThreeJS 新网格 vs 克隆

c++ - 如何在 C++ 中使用 std::vector 作为 std::unordered_map 的键类型?