首页 > 编程知识 正文

向量求平行四边形面积,向量叉积向量

时间:2023-05-06 16:32:30 阅读:235563 作者:1843

题目链接:点击打开链接

题目大意:按逆时针给出n个坐标,求该n边形的面积。

题目思路:利用向量叉积求n边形面积  每个三角形面积为(x1*y2-y1*x2)/2

本人第一次不是用向量法来做,把直接n边形分成n-2个三角形,最终总是过不了,一查资料才知道,多边形分凹凸多边形,凹多边形使用直接分割法,不太好做。

下面先给大家分享错误代码:(只适用与凸多边形)

/*把n边形分割成n-2个三角形,在求各个三角形的面积此方法只能求凸多边形面积*/import java.util.*;class Main{public static void main(String args[]){Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();if(n==0){break;}int x1=sc.nextInt();int y1=sc.nextInt();Point p1=new Point(x1,y1);//第一个点int x2=sc.nextInt();int y2=sc.nextInt();Point p2=new Point(x2,y2);//第二个点double areaSum=0;//所有三角形的面积和for(int i=0;i<n-2;i++){int x3=sc.nextInt(); int y3=sc.nextInt();Point p3=new Point(x3,y3);//第三个点areaSum+=p1.area(p2,p3);//求(p1,p2,p3)三个点的面积,areaSum累加p2=p3;//把p3赋值给p2,在把新传入的点记为p3}System.out.println(String.format("%.1f",areaSum));}}}class Point{//Point类 x,y坐标public int x;public int y;public Point(int x,int y){this.x=x;this.y=y;}public double length(Point p1,Point p2){//求2点之间的距离return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}public double area(Point p1,Point p2){//求3个点(p1,p2,this)组成的三角形的面积double l1=length(p1,p2);double l2=length(p2,this);double l3=length(p1,this);double p=(l1+l2+l3)/2;return Math.sqrt(p*(p-l1)*(p-l2)*(p-l3));//海伦公式求三角形面积}}

下面是通过向量法求多边形面积:(该方法使用与任意多边形)

代码实现如下:

/* * 思路:以向量方向计算 *把多边形分割成若干个小三角形,进行分别计算并累加,注意要按一个方向累加(逆时针或顺时针) * 每个小三角形的计算公式: (x1*y2-x2*y1)/2 */import java.util.*;class Main{public static void main(String args[]){Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();if(n==0){break;}int x[]=new int[n];//存放x坐标int y[]=new int[n];//存放y坐标for(int i=0;i<n;i++){x[i]=sc.nextInt();y[i]=sc.nextInt();}double area=0;for(int i=0;i<n;i++){int t=i+1;//t为下一个顶点if(t==n){//当i到第n个顶点时,令t也就是下一个顶点为第一个t=0;}area+=(x[i]*y[t]-x[t]*y[i])/2.0;//三角形向量计算公式}area=Math.abs(area);//当面积为负时,使其为正System.out.println(String.format("%.1f",area));}}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。