第六周任务四(由点表示的三角形类)

#include<iostream>
#include<Cmath>
using namespace std;
class Cpoint      //定义一个点类
{
private:
	double x;
	double y;
public:
	Cpoint(double xx=0,double yy=0);
	double distance(Cpoint p) const;//求两点间的距离
    void input(); //输入点
    void output();//输出点
};

class CTriangle //定义一个三角形类
 {
public:
	CTriangle(Cpoint &x,Cpoint &y,Cpoint &z):A(x),B(y),C(z){}//给出三点的构造函数
	void setCTriangle(Cpoint &x,Cpoint &y,Cpoint &z);
	double perimeter(void);//求三角形的周长
	double area(void);//求三角形的面积
	bool isRightTriangle();//是否为直角三角形
	bool isIsoscelesTriangle();//是否为等腰三角形
private:
    Cpoint A,B,C;
};
Cpoint::Cpoint(double xx,double yy):x(xx),y(yy){}
 //输入坐标点 
void Cpoint::input()
{
	char ch;
	while(1)
	{
		cin>>x>>ch>>y;
		if(ch!=',')
			cout<<"格式出现错误!"<<endl;
		else
			break;
	}
}

void Cpoint::output()
{
    cout<<"("<<x<<','<<y<<")"<<endl;
}
double Cpoint::distance(Cpoint p) const
{
	return sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}

void CTriangle::setCTriangle(Cpoint &x,Cpoint &y,Cpoint &z)
{
	A=x;
	B=y;
	C=z;
}
double CTriangle::perimeter(void)//求周长
{
	double a=B.distance(C),b=C.distance(A),c=A.distance(B);
	return (a+b+c);
}
double CTriangle::area(void)//求面积
{
    double a=B.distance(C),b=C.distance(A),c=A.distance(B);
	double p=(a+b+c)/2;
	return sqrt(p*(p-a)*(p-b)*(p-c));

}
bool CTriangle::isRightTriangle()
{
    double a=B.distance(C),b=C.distance(A),c=A.distance(B);
	if(abs(a*a+b*b-c*c)<(1e-6)||abs(c*c+b*b-a*a)<(1e-6)||abs(a*a+c*c-b*b)<(1e-6))
		return true;
	else
		return false;
}
bool  CTriangle::isIsoscelesTriangle()
{
    double a=B.distance(C),b=C.distance(A),c=A.distance(B);
	if((abs(a-b)<1e-6)||(abs(b-c)<1e-6)||(abs(c-a)<1e-6))
		return true;
	else 
		return false;
}
void main(void)
{ 
	    CTriangle Tri1(Cpoint(6,0),Cpoint(0,0),Cpoint(0,4));    //定义三角形类的一个实例(对象)   
	    cout<<"该三角形的周长为:"<<Tri1.perimeter()<<",面积为:"<<Tri1.area()<<endl<<endl;  
	    cout<<"该三角形"<<(Tri1.isRightTriangle()?"是":"不是")<<"直角三角形"<<endl;  
	    cout<<"该三角形"<<(Tri1.isIsoscelesTriangle()?"是":"不是")<<"等腰三角形"<<endl;  
	    system("pause");
}
 


问题:为什么当设置短距离点时,不能正确判断是否是等腰三角形?例如(1,0)(0,0)(0,2)

 

 

小结:distance(Cpoint p) const 这一函数失球两点间距离的函数,把类的一个对象做为函数的参数,是类的独特用法,把两个不同对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个C++程序,可以用三角形顶点的线性组合来表示三角形内的任意一点: ```c++ #include <iostream> using namespace std; // 定义三维向量 struct Vector3 { double x, y, z; Vector3(double x = 0, double y = 0, double z = 0): x(x), y(y), z(z) {} }; // 定义三角形 struct Triangle { Vector3 v1, v2, v3; Triangle(Vector3 v1, Vector3 v2, Vector3 v3): v1(v1), v2(v2), v3(v3) {} }; // 计算三角形面积 double triangleArea(Triangle t) { Vector3 v1 = t.v2 - t.v1; Vector3 v2 = t.v3 - t.v1; return 0.5 * sqrt(pow(v1.y * v2.z - v1.z * v2.y, 2) + pow(v1.z * v2.x - v1.x * v2.z, 2) + pow(v1.x * v2.y - v1.y * v2.x, 2)); } // 判断点是否在三角形内部 bool isInsideTriangle(Triangle t, Vector3 p) { double area1 = triangleArea(Triangle(t.v1, t.v2, p)); double area2 = triangleArea(Triangle(t.v2, t.v3, p)); double area3 = triangleArea(Triangle(t.v3, t.v1, p)); double areaSum = area1 + area2 + area3; double triangleAreaSum = triangleArea(t); return areaSum >= triangleAreaSum - 1e-6; // 使用 1e-6 作为精度误差 } // 计算三角形顶点的线性组合 Vector3 barycentric(Triangle t, Vector3 p) { Vector3 v1 = t.v2 - t.v1; Vector3 v2 = t.v3 - t.v1; Vector3 v3 = p - t.v1; double d00 = v1.x * v1.x + v1.y * v1.y + v1.z * v1.z; double d01 = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; double d11 = v2.x * v2.x + v2.y * v2.y + v2.z * v2.z; double d20 = v3.x * v1.x + v3.y * v1.y + v3.z * v1.z; double d21 = v3.x * v2.x + v3.y * v2.y + v3.z * v2.z; double denom = d00 * d11 - d01 * d01; double v = (d11 * d20 - d01 * d21) / denom; double w = (d00 * d21 - d01 * d20) / denom; double u = 1.0 - v - w; return Vector3(u, v, w); } int main() { // 定义三角形顶点和测试点 Vector3 v1(0, 0, 0), v2(1, 0, 0), v3(0, 1, 0), p(0.5, 0.5, 0); // 构建三角形并检查点是否在三角形内部 Triangle t(v1, v2, v3); if (isInsideTriangle(t, p)) { cout << "The point is inside the triangle." << endl; // 计算三角形顶点的线性组合 Vector3 b = barycentric(t, p); cout << "barycentric coordinates: u=" << b.x << ", v=" << b.y << ", w=" << b.z << endl; } else { cout << "The point is outside the triangle." << endl; } return 0; } ``` 这个程序中,我们首先定义了一个 Vector3 结构体表示三维向量,然后定义了一个 Triangle 结构体表示三角形。接着,我们实现了 triangleArea 函数来计算三角形面积,isInsideTriangle 函数来判断一个点是否在三角形内部,以及 barycentric 函数来计算三角形顶点的线性组合。 在主函数中,我们定义了三角形顶点和测试点,并构建了一个 Triangle 对象。然后,我们调用 isInsideTriangle 函数来检查点是否在三角形内部,如果点在三角形内部,就调用 barycentric 函数来计算三角形顶点的线性组合并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值