缺等腰三角形
如果这个类是final的,我觉得整体思路上没什么问题.有几个细节再把握下
1.将度数也设为double,设想你new时传递参数是写90度方便,还是写90f度方便.
2.构造函数太独立了,各个构造函数没有联系性。比如说任意三边如果能判定是正三角就可以直接调用正三角的构造函数...
3.感觉这个类如果写get方法还好,如果写set方法有点麻烦,传进参数时得重新判定此参数和其他两个参数构成三角形的条件能不能成立,建议单独写个异常类抛出异常
4.这个类的重点主要是把握住传递进去的参数能不能构成三角形,还是建议单独写个判断是不是成立的异常类。
这是我以前做的求三角形的面积 Point类是一个点的坐标类
可以不用判断是什么三角形,直接求面积和周长
package shape;
public class Triangle {
/**
* point1,point2,point3为三角形的三点
*/
private Point point1;
private Point point2;
private Point point3;
public Triangle() {
super();
}
/**
* 构造方法
* @param point1 Point型
* @param point2 Point型
* @param point3 Point型
*/
public Triangle(Point point1, Point point2, Point point3) {
super();
this.point1 = point1;
this.point2 = point2;
this.point3 = point3;
}
public Point getPoint1() {
return point1;
}
public void setPoint1(Point point1) {
this.point1 = point1;
}
public Point getPoint2() {
return point2;
}
public void setPoint2(Point point2) {
this.point2 = point2;
}
public Point getPoint3() {
return point3;
}
public void setPoint3(Point point3) {
this.point3 = point3;
}
/**
* 求三角形一条边A
* @return double型
*/
private double triangleA(){
return Math.hypot(point1.getCoordinate_x()-point2.getCoordinate_x(),point1.getCoordinate_y()-point2.getCoordinate_y());
}
/**
* 求三角形一条边B
* @return double型
*/
private double triangleB(){
return Math.hypot(point1.getCoordinate_x()-point3.getCoordinate_x(),point1.getCoordinate_y()-point3.getCoordinate_y());
}
/**
* 求三角形一条边C
* @return double型
*/
private double triangleC(){
return Math.hypot(point2.getCoordinate_x()-point3.getCoordinate_x(),point2.getCoordinate_y()-point3.getCoordinate_y());
}
/**
* 判断这三点是否可以构成三角形
* @return boolean型
*/
private boolean isTriangle(){
if(Math.abs(this.triangleA()+this.triangleB()) > this.triangleC() && Math.abs(this.triangleA()-this.triangleB())
return true;
}
else{
return false;
}
}
/**
* 如果可以构成三角形求三角形的面积
* 不可以构成三角形return 0;
* @return double型
*/
public double countArea(){
if(!this.isTriangle()){
return 0;
}
else{
double p = (this.triangleA() + this.triangleB() + this.triangleC())/2;
return Math.sqrt(p * (p - this.triangleA()) * (p - this.triangleB()) * (p - this.triangleC()));
}
}
public static void main(String[] args){
/*Point point1 = new Point(1,2);
Point point2 = new Point(1,3);
Point point3 = new Point(4,3);
Triangle triangle = new Triangle(point1,point2,point3);
System.out.println(triangle.countArea());
*/Point point1 = new Point(0,0);
Point point2 = new Point(0,4);
Point point3 = new Point(3,0);
Triangle triangle = new Triangle(point1,point2,point3);
System.out.println(triangle.countArea());
}
}
求面积用海轮公式:
已知三角形三边长为a,b,c.
周长的一半p = (a+b+c)/2
三角形面积=sqrt(p*(p-a)*(p-b)*(p-c))
学习了!
引用 4 楼 sagegz 的回复:求面积用海轮公式:
已知三角形三边长为a,b,c.
周长的一半p = (a+b+c)/2
三角形面积=sqrt(p*(p-a)*(p-b)*(p-c))
这个公式没见过 用过
学习
顶,好东西
不错。。。MARK...学习。。。。
4.是不是我的这个类根本的思路就不对?
不能说不对,不过这个类看上去的确很“死板”。
风格属于典型的结构化编程产物。
功能不够灵活。
你可以想象你的桌面上现在有一个“智能”的三角形“对象”的“实例”。
你可以改变它的某些属性,包括但不限于三条边的长度,三个角的角度,周长属性,面积属性。
每当你改变其中的某个属性,桌面上的三角形就会自动调整。
海伦公式也好,正余弦定理也罢,编写一个auto_update过程,再只要GET/SET上述属性调用即可。
up
貌似构造函数中有3个都是参数个数和类型完全相同……
用海伦公式求面积最简单。
这样全是全,可能用在教学三角形上挺好。实际用不必这样,根据实际应用可以更简单,如求面积海伦公式足以。
其实针对楼主的这个问题,可以简单化。
比如归纳为已知三个边的长度,可以唯一确定一个三角形(三角形全等定理)。所以你唯一需要判断的就是这三个边能否确定一个三角形。可根据两边之和大于第三边;两边之后小于第三边来确定。
然后剩下的就是海伦定理求面积,已经三边相加求周长。
所以不用搞得那么复杂,管它什么等腰还是等边。
float没有问题,边和角都是实数集合。
你的计算处理都在构造函数里完成了,还设置set方法有什么用?
我觉得楼主可以对整体设计改一下,用一个abstract类做父类,其余的五个做子类继承。还有最好把计算处理的代码从构造函数里分离出来另做一个函数。
学习
学习
引用 4 楼 sagegz 的回复:求面积用海轮公式:
已知三角形三边长为a,b,c.
周长的一半p = (a+b+c)/2
三角形面积=sqrt(p*(p-a)*(p-b)*(p-c))
对就是这个 初中就学了忘了
学习
学习
我觉得,如果你这个三角形是经常变的话,那么它的成员不需要那么多;
正如你写的构造函数一样,可以只要三边,或者两边及夹角就好了(有了些条件,三角形就唯一确定了)。
这样的话,需要做的就是(以三边为例):
1. 写构造的时候要把不是以三边为参数的构造函数把三边计算出来
2. 写出getter时,不是取三边的话,都要用运算,如取周长就返回a+b+c
3. 写setter的时候,如是允许set角度,也是要把变化的边计算出来设回去
...
1、构造函数应该要能够检查不可能的条件,并抛出异常。这个前面已经有人说了
2、成员的数量,一般只要保存3条边的长度就可以确定三角形的属性了,不需要保存角度信息。在数据量的应用中,可以用时间来换取空间。lz可以权衡取舍
3、如果是我来做这个class,我会做成只有getter,没有setter,三角形的属性,只能读,不能改,这样可以简化类的定义。可以参考字符串类的做法来实现属性的变化:obj=obj.modify(),函数复杂根据变化的内容,重新构造一个对象并返回,而不是直接在原对象上修改
做个记录!!!
谢谢楼主啊,这个刚好是我们今天的作业
asdfasf
学习了
太长了,不想看。
虽然目前对我没用,但是我还是收藏下
mark
需要写这么多吗?搞笑
看过。。学习。。。
留个记录
有点难度啊
有意思!不过都是c语言的不懂哈
该回复于2009-06-04 11:10:07被版主删除
up
tou tong
写的不错,jf
其实压根没有这么麻烦....
学习了,真的很不错
很不错了啦
围观,看起来不错,支持楼主
不错
求面积用海轮公式:
已知三角形三边长为a,b,c.
周长的一半p = (a+b+c)/2
三角形面积=sqrt(p*(p-a)*(p-b)*(p-c))
这个方法更实用一点,当然前提是这个是三角形,要是连三角形都不是那么(a+b>=c||a-b<=c)
引用 9 楼 xdop 的回复:4.是不是我的这个类根本的思路就不对?
不能说不对,不过这个类看上去的确很“死板”。
风格属于典型的结构化编程产物。
功能不够灵活。
你可以想象你的桌面上现在有一个“智能”的三角形“对象”的“实例”。
你可以改变它的某些属性,包括但不限于三条边的长度,三个角的角度,周长属性,面积属性。
每当你改变其中的某个属性,桌面上的三角形就会自动调整。
海伦公式也好,正余弦定理也罢,编写一个auto_…
我支持,面向对象的方法不应该像lz方法。。
好 谢谢楼主分享
1)缺少等腰三角形的构造方法;
2)其中2和4可以合并成一个方法,在方法内部判断这个角度的值;
3)3中应该加入判断三条边是否可以构成三角形;
已经是一个三角形了,怎么能 set 其中的一个参数呢?
不管把三边中的一边,还是三角中的一角设成其他的值,都无法再构成三角形了!
边和角在数学意义上来说是不同的类型,而你只是仅仅采用 double 和 float 来分开说明,
我认为在面向对象的意义上来说是说不过去的。
可以定义一个 Line 类和 Angle 类分别表示边和角。
受教了!