zoukankan      html  css  js  c++  java
  • [洛谷P2785] 物理1(phsic1)-磁通量

    随便翻到的一道题......

    题目传送门

    这道题是用向量叉积求多边形面积。

    首先讲一下向量叉积(也叫外积)。

    设两个向量的坐标表示为(x1,y1)、(x2,y2)。

    那么它们的叉积为x1*y2-x2*y1。

    其几何意义为两个向量所成的平行四边形的面积(浅蓝色部分)。

    两个向量的叉积与这两个向量都垂直,且有正负之分。

    叉积的正负取决于两向量夹角sin值的正负(图中叉积均为:绿向量×红向量)。

    对于两个点A、B以及原点O,向量OA与向量OB的叉积的一半代表三角形OAB的面积。

    这样我们就能通过这个把多边形分割成三角形,进而求出多边形的面积。

    对于下面这个四边形ABCD:

    S(ABCD)=S(OAB)+S(OBC)-S(OCD)-S(ODA)。

    我们沿着多边形走一周,依次加上(或减掉)相邻的两个顶点与原点形成的三角形的面积就行。

    三角形的面积就用叉积算嘛。

    而且你可以发现向量的叉积特别可爱,都不需要你判断是该加上还是该减掉。

    叉积算出来是正的,对面积的贡献就为正;是负的,对面积的贡献就为负。

    最后别忘了最后一个点和第一个点也要求一下叉积。

    所以多边形的面积就这么愉快地算出来啦~

     1 #include<cstdio>
     2 
     3 int n;
     4 double b,ans;
     5 
     6 struct vec
     7 {
     8     double x,y;
     9 }a[1000005];
    10 
    11 double cross(vec q,vec w)
    12 {
    13     return q.x*w.y-w.x*q.y;
    14 }
    15 
    16 int main()
    17 {
    18     scanf("%d%lf",&n,&b);
    19     for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);
    20     a[n+1]=a[1];
    21     for(int i=1;i<=n;i++)ans+=cross(a[i],a[i+1]);
    22     ans=ans*b*0.50;
    23     if(ans<0)ans=-ans;
    24     printf("%.4lf",ans);
    25     return 0;
    26 }
  • 相关阅读:
    textArea中的placeholder属性不起作用
    文件超出大小,进度条监听一直死循环一般的报错
    AJAX提交表单,上传出错的国际化信息无法显示在jsp页面上
    使用ajax提交表单,页面还是会自动刷新
    Springboot + vue 前后端分离学习
    Spring复习
    AJAX学习
    JWT以及相干实践
    动态sql语句MyBats
    SSH项目整合---项目环境搭建
  • 原文地址:https://www.cnblogs.com/eternhope/p/9760936.html
Copyright © 2011-2022 走看看