求一个平面内的三个力的合力大小及方向

6 篇文章 0 订阅
5 篇文章 0 订阅
import java.math.BigDecimal;
import java.util.Scanner;
public class heli {
double FA,FB,FC;
double fa,fb,fc;
Scanner scan;
public heli(){
shuruzhi();
}
public void shuruzhi(){
scan=new Scanner(System.in);
System.out.println("请输入要求的合力的三个力的大小和方向(方向请务必输入0~360表示)," +
"\n格式是:123 23 234 345 12 12,其中123,234,12表示三个力的大小23,345,12表示对应的力的方向,它们分别用空格分开:");
FA=Double.parseDouble(scan.next());fa=Double.parseDouble(scan.next());FB=Double.parseDouble(scan.next());fb=Double.parseDouble(scan.next());FC=Double.parseDouble(scan.next());
fc=Double.parseDouble(scan.next());
li a,b,c;
a=new li(FA,fa);//三个力实例化
b=new li(FB,fb);
c=new li(FC,fc);
li temp=qiou(a,b);//两次求合力过程
li end=qiou(temp,c);
System.out.println("三个力的合力大小和方向分别是:"+end.F+"\t"+end.f);
}
public li qiou(li fa,li fb){//求两个力合力的逻辑实现在此
li temp;double FC = 0,jj=0,fc = 0;
if(ismax(fa.f,fb.f)){//a的度数大于b的度数
FC=Math.sqrt(Math.pow(fa.F, 2)+Math.pow(fb.F, 2)+2*fa.F*fb.F*Math.cos(((double)qqiou(fa.f,fb.f)/180)*Math.PI));
if(qqiou(fa.f,fb.f)==180){//当夹角为180
BigDecimal ffa=new BigDecimal(fa.F);//BigDecimal 类使用户能完全控制舍入行为
BigDecimal ffb=new BigDecimal(fb.F);
double f1=ffa.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();//只保留四位有效数字
double f2=ffb.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
if(f1>f2)
fc=fa.f;
else if(f1<f2)
fc=fb.f;
else
fc=0;
}
else{//当夹角不为180
jj=(double)Math.acos((double)(Math.pow(FC, 2)+Math.pow(fa.F,2)-Math.pow(fb.F, 2))/(2*FC*fa.F))/Math.PI*180;
if(iismax(fa.f,fb.f)){//当两者相差为小于180
fc=fa.f-jj;
}
else{//当两者相差大于180
fc=fa.f+jj;
if(fc>360)
fc-=360;//?
}
}
}
else{
FC=Math.sqrt(Math.pow(fa.F, 2)+Math.pow(fb.F, 2)+2*fa.F*fb.F*Math.cos(((double)qqiou(fb.f,fa.f)/180)*Math.PI));
if(qqiou(fb.f,fa.f)==180){//当夹角为180
BigDecimal ffa=new BigDecimal(fa.F);//BigDecimal 类使用户能完全控制舍入行为
BigDecimal ffb=new BigDecimal(fb.F);
double f1=ffa.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
double f2=ffb.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
if(f1>f2)
fc=fa.f;
else if(f1<f2)
fc=fb.f;
else
fc=0;
}
else if(qqiou(fb.f,fa.f)==0)//当夹角为0时
fc=fb.f;//
else{//当夹角不为180
//System.out.println("here"+(double)(Math.pow(FC, 2)+Math.pow(fb.F,2)-Math.pow(fa.F, 2))/2*FC*fb.F);///
jj=(double)(Math.acos((double)(Math.pow(FC, 2)+Math.pow(fb.F,2)-Math.pow(fa.F, 2))/(2*FC*fb.F)))/Math.PI*180;
if(iismax(fb.f,fa.f)){//当两者相差为小于180
fc=fb.f-jj;
}
else{//当两者相差大于180
fc=fb.f+jj;
if(fc>360)
fc-=360;//?
}
}
}
BigDecimal ffc=new BigDecimal(FC);//BigDecimal 类使用户能完全控制舍入行为
double FFC=ffc.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal ff=new BigDecimal(fc);//BigDecimal 类使用户能完全控制舍入行为
double xx=ff.setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
temp=new li(FFC,xx);
//System.out.println("##"+temp.F+"\t"+temp.f);///
return temp;
}
public boolean ismax(double a,double b){
if(a>b)
return true;
return false;
}
public boolean iismax(double a,double b){
if(a-b>180)
return false;
return true;
}
public double qqiou(double a,double b){
if(a-b>180)
return 360-a+b;
return a-b;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new heli();
}


}
class li{
double F;
double f;
public li(double F,double f){
this.F=F;
this.f=f;
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值