提供三个点的坐标,求出平行四边形的面积

SheFuZuo 2009-05-17 03:34:20
计算公式错误,请各位帮忙修正:
#include <iostream>
#include <cmath>
using namespace std;
#ifndef ShapeH
#define ShapeH

class Shape
{
public:
virtual double area()const = 0;
virtual void draw()const = 0;
};

class Point
{
//确定一个点的坐标
double x, y;
public:
Point(double x0 = 0.0, double y0 = 0.0):x(x0),y(y0){}
double getX()const{return x;}
double getY()const{return y;}
};

class Parallel:public Shape
{
//定义了三个点
Point P1, P2, P3;
public:
Parallel(double a, double b, double c, double d, double e, double f):P1(a, b),P2(c,d),P3(e,f){}
virtual double area()const
{
//这里的公式有误,请各位帮忙修正
int log = (P3.getY() - P3.getY()) - (P3.getX() - P2.getX());
int hih = P2.getY() - P1.getY();
return log * hih;
}
virtual void draw()const{Shape::draw(); cout << "平行四边形";}
Point getParP1()const{return P1;}
Point getParP2()const{return P2;}
Point getParP3()const{return P3;}
};

void Shape::draw() const{cout << " 这里应输出一个";}
#endif

void showArea(Shape &s) { cout << s.area();}
void drawShape(Shape &s){ s.draw();}

int main()
{
//只提供三个点
Parallel obj4(4, 4, 5, 5, 6, 6);
showArea(obj4);
drawShape(obj4);
cout << endl;

system("pause");
return 0;
}
...全文
743 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SheFuZuo 2009-05-17
  • 打赏
  • 举报
回复
非常感谢。
f22fbi 2009-05-17
  • 打赏
  • 举报
回复
求出三角形的面积
再乘以2
fice1989 2009-05-17
  • 打赏
  • 举报
回复
首先你的测试数据
Parallel obj4(4, 4, 5, 5, 6, 6);
就有点问题,这3个点都在一条线上了...

然后如果3个点是可以任意给定的话,你计算宽和高的式子也是不对的:
int log = (P3.getY() - P3.getY()) - (P3.getX() - P2.getX());
int hih = P2.getY() - P1.getY();

要么就用海伦公式:
三角形面积S=√[P(P-A)(P-B)(P-C)],
其中P=(A+B+C)/2
A、B、C表示三角形的边长,√表示根号,即紧跟后面的括号内的全部数开根号。

2楼的回复就是这个方法.

另外海伦公式还有变形:
S=√[P(P-A)(P-B)(P-C)]
=(1/4)√[(A+B+C)(A+B-C)(A+C-B)(B+C-A)] //变形1
=(1/4)√{[(A+B)^-C^][C^-(A-B)^]} //变形2
=(1/4)√{(A^+B^-C^+2AB)[-(A^+B^-C^-2AB)]} //变形3
=(1/4)√[4A^B^-(A^+B^-C^)^] //变形4

你可以自己选择一个作为面积的计算式

papaofdoudou 2009-05-17
  • 打赏
  • 举报
回复
哦,对了,上面求的是三角形的面积,如果求四边形的话0.5就不用乘了,return _i*_j*_m;
papaofdoudou 2009-05-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <cmath>
using namespace std;
#ifndef ShapeH
#define ShapeH

class Shape
{
public:
virtual double area()const = 0;
virtual void draw()const = 0;
};

class Point
{
//确定一个点的坐标
double x, y;
public:
Point(double x0 = 0.0, double y0 = 0.0):x(x0),y(y0){}
double getX()const{return x;}
double getY()const{return y;}
};

class Parallel:public Shape
{
//定义了三个点
Point P1, P2, P3;
public:
Parallel(double a, double b, double c, double d, double e, double f):P1(a, b),P2(c,d),P3(e,f){}
virtual double area()const
{


double _i=sqrt((P1.getY()-P2.getY())*(P1.getY()-P2.getY())+(P1.getX()-P2.getX())*(P1.getX()-P2.getX()));
double _j=sqrt((P1.getY()-P3.getY())*(P1.getY()-P3.getY())+(P1.getX()-P3.getX())*(P1.getX()-P3.getX()));
double _k=sqrt((P2.getY()-P3.getY())*(P2.getY()-P3.getY())+(P2.getX()-P3.getX())*(P2.getX()-P3.getX()));

double _l=(_i*_i+_j*_j-_k*_k)/(2*_i*_j);

double _m=sqrt(1-_l*_l);

return _i*_j*_m*0.5;

}
virtual void draw()const{Shape::draw(); cout << "平行四边形";}
Point getParP1()const{return P1;}
Point getParP2()const{return P2;}
Point getParP3()const{return P3;}
};

void Shape::draw() const{cout << " 这里应输出一个";}
#endif

void showArea(Shape &s) { cout << s.area();}
void drawShape(Shape &s){ s.draw();}

int main()
{
//只提供三个点
Parallel obj4(4, 4, 5, 5, 6, 6);
showArea(obj4);
drawShape(obj4);
cout << endl;

system("pause");
return 0;
}
adventurelw 2009-05-17
  • 打赏
  • 举报
回复
int log = (P3.getY() - P3.getY()) - (P3.getX() - P2.getX());

int log = (P3.getY() - P1.getY()) - (P3.getX() - P2.getX());

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧