此方法的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();
}
}
}```