(优化上周作业代码)给定两条直线求出两直线与X轴所成三角形面积

此方法的bug为所成三角形在Y轴而不在X轴

import java.util.Scanner;
public class area {	
	static Scanner Input = new Scanner(System.in);// 需要导入import java.util.Scanner;
	static int parallel(float x1, float y1, float x2, float y2) {
		// 判定两条直线是否平行,平行返回1,相交返回0
		if (x1 * y2 - x2 * y1 == 0) {
			System.out.println("两直线平行,无法求出面积");
			return 1;
		}
		System.out.println("两直线不平行,可求出面积");
		return 0;
	}
	public static void main(String[] args) {
		float x[] = new float[4];
		float y[] = new float[4];//x坐标 y坐标
		initialize(x,y,4); //初始化四个点坐标  用以确定两条直线
		if (parallel(x[1]-x[0],y[1]-y[0],x[3]-x[2],y[3]-y[2]) == 0) { // 如果两直线无法求出面积
			if(NoneK(x,y)==1) ;//某一直线不存在斜率
			else ExistKs(x,y) ;//两条直线均存在斜率
			}
	}
	private static void ExistKs(float[] x, float[] y) { //两条直线均存在斜率
		float k[] = new float[2];//两直线斜率k
		float b[] = new float[2];//两直线常数b
		float t[] = new float[2];//两直线所成交点
		float h;	//三角形高
		float d,s;  //三角形底长和面积
		k[0] = Qk(x,y,1);
		k[1] = Qk(x,y,3);
		b[0] = Qb(x[0],y[0],k[0]);
		b[1] = Qb(x[2],y[2],k[1]);
		Qt(t,k,b);//已知两条直线求斜率,t为交点
		PrintLine(k[0],b[0]);
		PrintLine(k[1],b[1]);
		System.out.println("两直线所成交点("+t[0]+","+t[1]+"),且三角形的高为"+t[1]);
		h = t[1];			
		d = -b[0]/k[0];//求出第一条直线与X轴相交的坐标
		s = -b[1]/k[1];//求出第二条直线与X轴相交的坐标
		d = Math.abs(d - s);//三角形的底长等于两坐标X相减的绝对值
		s = (float) (0.5 * d * h);//三角形面积公式
		System.out.println("三角形面积:" + s);
		
	}
	private static void PrintLine(float k, float b) {
		System.out.println("现求出斜率存在一条直线:y="+k+"x"+"+"+b);		
	}
	private static int NoneK(float[] x, float[] y) {   	//某一直线不存在斜率
		float k;//存在直线斜率k
		float b;//存在直线常数b
		float t[] = new float[2];//两条直线所成交点,t[0]为x,t[1]为y
		float h;	//三角形高
		float d,s;  //三角形底长和面积
		if(x[1]==x[0]) {
			System.out.println("某一直线斜率不存在,代数式为x="+x[0]);			
			k = Qk(x,y,3);
			b = Qb(x[3],y[3],k);
			PrintLine(k,b);
			s = t[0] = x[0];
			h = t[1] = NoneKQt(x[0],k,b); //一方斜率不存在,求两直线交点y坐标	
			d = -b/k;//求出存在斜率直线与X轴相交的坐标			
			d = Math.abs(d - s);//三角形的底长等于两坐标X相减的绝对值
			s = (float) (0.5 * d * h);//三角形面积公式
			System.out.println("三角形面积:" + s);			
			return 1;//一条斜率不存在返回1
		}
		if(x[3]==x[2]) {
			System.out.println("斜率不存在,某一直线为x="+x[2]);
			k = Qk(x,y,1);
			b = Qb(x[1],y[1],k);			
			PrintLine(k,b);
			s = t[0] = x[2];
			h = t[1] = NoneKQt(x[2],k,b); //一方斜率不存在,求交点y坐标
			d = -b/k;//求出存在斜率直线与X轴相交的坐标			
			d = Math.abs(d - s);//三角形的底长等于两坐标X相减的绝对值
			s = (float) (0.5 * d * h);//三角形面积公式
			System.out.println("三角形面积:" + s);
			return 1;//一条斜率不存在返回1
		}
		return 0;		
	}
	private static void Qt(float[] t, float[] k, float[] b) { //求两直线斜率均存在求出交点
		t[0] = (b[0]-b[1])/(k[1]-k[0]);
		t[1] = b[0]+t[0]*k[0];		
	}
	private static float NoneKQt(float x, float k, float b) {//求一方斜率不存在的两直线交点,返回y坐标
		return k*x+b;
	}
	private static float Qb(float x, float y, float k) {//求出直线常数b
		return y-k*x;
	}
	private static float Qk(float[] x,float[] y,int i) {  //求出直线斜率k				
		return (y[i]-y[i-1])/(x[i]-x[i-1]);
	}
	private static void initialize(float[] x,float[] y, int n) {  //初始化四个点坐标
		int i;
		System.out.println("请输入四个坐标系的点,前面两个点确定一条直线,后面两点确定另一条直线");
		for(i=0;i<n;i++) {
			System.out.println("输入第"+(i+1)+"个坐标(可输入任意实数)");
			x[i] = Input.nextFloat();
			y[i] = Input.nextFloat();
		}
	}
}```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值