精华内容
下载资源
问答
  • As usual, Alice finishes her delicious cake at noon. Unfortunately, the smell of cake beckoned hungry Bob, and he decided to rob one piece o

    As usual, Alice finishes her delicious cake at noon. Unfortunately, the smell of cake beckoned hungry Bob, and he decided to rob one piece of cake.

    The cake is a convex polygon with N edges. At the beginning, Bob cut it along the diagonals. After M cuts, Bob decided to rob the 'largest' piece of cake. Strangely, in Bob's opinion, the piece has the most number of edge is the biggest one.

    Please help Bob to find the 'largest' piece.

    Input

    There are multiple test cases (about 20).

    The first line of each test case contains two integer number NM (5 <= N <= 10000), indicating the number of point of the cake and the cut, respectively.

    The following M lines contain two integer x, y (1 <= x, y <= N), denoting the index of the starting and ending cut point. (the index of points mark from 1 to N clockwise.)

    The input will guarantee that all of the cuts will not intersect inside the cake, but they may cross each other at the edge of cake, and Bob won't cut along the initial edge of the cake.

    Output

    Output the maximal size (most number of edges) of the piece which Bob will get.

    Sample Input

    7 2
    3 6
    7 2
    

    Sample Output

    4

    // 还没想通

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define N 20010
    using namespace std;
    struct data
    {
        int l, r, s;
        data(int _l, int _r, int _s) : l(_l),r(_r),s(_s){}
        data(){}
    }d[N];
    bool cmp(data a, data b)
    {
        return a.s < b.s;
    }
    int next[N], n, m;
    int main()
    {
        while (scanf("%d%d", &n, &m)!= EOF)
        {
            int x, y;
            for (int i = 1; i < 2 * n; ++i)
                next[i] = i + 1;
            next[2 * n] = 1;
            for (int i = 1; i <= m; ++i)
            {
                scanf("%d%d", &x, &y);
                if (x > y) swap(x, y);
                int l = y - x + 1;
                if (l > n - l + 2)//?
                {
                    int temp = x; x = y; y = temp + n;
                    l = n - l;
                }
                d[i] = data(x, y, l);
            }
            sort(d + 1, d + 1 + m, cmp);
            int res = 0, sum = n;
            for (int i = 1; i <= m; ++i)
            {
                int l = 0, s = d[i].l;
                while (s != d[i].r)
                {
                    s = next[s], l++;
                }
                res = max(res, l + 1);
                sum -= (l - 1);
                next[d[i].l] = d[i].r;
                if ((d[i].l <= n) && (d[i].r <= n)) next[d[i].l + n] = d[i].r + n;
                else next[d[i].l + n] = d[i].r - n;
            }
            res = max(res, sum);
            printf("%d\n", res);
        }
        return 0;
    }

    展开全文
  • 不过最近有了个需求,在地图上画一个多边形时候同时进行多边形的边长、周长和面积的计算,于是重新又写了下这个方法。代码不难,但是觉得挺有意思,于是写博文记录一下。  首先,需要在地图上画多边形。我们看到的...

            Arcgis for Android的地图操作里,放大缩小地图、图层切换、定位、测距测面等都是它的一些基本操作,封装后一般调用就是了,很简单。不过最近有了个需求,在地图上画一个多边形时候同时进行多边形的边长、周长和面积的计算,于是重新又写了下这个方法。代码不难,但是觉得挺有意思,于是写博文记录一下。

            首先,需要在地图上画多边形。我们看到的每个地图都是一个图层,要在地图上画个多边形,就是在图层上加载一个图形,而这个图形就是用Graphic类来实现的。从Graphic最简单的构造函数:

    public Graphic(Geometry geometry, Symbol symbol) 
            我们可以看出,它主要由一个Geometry和一个Symbol构成。Geometry代表着所有0.1.2维几何图形,常用的包含了Point(点),Line(线段),Polyline(折线),Polygon(面)等。Symbol代表着这些几何图形的样式,比如点线面的大小和颜色等。

            了解了基本信息以后,首先要执行的是点击地图画多边形,点击事件是:

    mMapView.setOnSingleTapListener(new OnSingleTapListener() {
        @Override
        public void onSingleTap(float v, float v1) {
            PointToDrawPolygon(v, v1);
        }
    });
             传的两个参数分别是屏幕的坐标。

             然后就是画多边形了。首先每次先要把图层清空一下,如果不清空,将会保留之前画的图形。想象一下,就是比如我们第三个点时候画了一个三角形,然后按第四个点时候画了一个四边形,如果不清空的话,就是四边形覆盖在三角形上的样子。

    if (messureGraphicsLayer!=null){
        messureGraphicsLayer.removeAll();
    }
            接下来是将屏幕点转为地图上的点,并设置样式画上去:

    Point mPoint = diitMapView.toMapPoint(v, v1);//选择点
    mPoints.add(mPoint);//选择点加入点的集合
    Graphic messurePoint = new Graphic(mPoint, symbolFactory.createMeasureMarkerSymbol());//点的要素初始化
    messureGraphicsLayer.addGraphic(messurePoint);//点的要素添加到图层
            这里说下Symbol类,主要有一下几种:


             然后是进行判断,设置面的初始点,以及将之后各个点连接成折线和面:

    if (mPoints.size() == 1) {
        messurePolygon.startPath(mPoints.get(0));//设置面的初始点
    }
    if (mPoints.size() > 1) {
        messureGraphicsLayer.removeAll();
        messurePolyline.setEmpty();
        messurePolygon.lineTo(mPoint);//连接到当前点击的点
        messurePolygon.lineTo(mPoints.get(0));//连接到初始点
        for (int i = 0; i < mPoints.size() - 1; i++) {
            messureLine.setStart(mPoints.get(i));
            messureLine.setEnd(mPoints.get(i + 1));
            messurePolyline.addSegment(messureLine, true);
            messureGraphicsLayer.addGraphic(new Graphic(mPoints.get(i), symbolFactory.createMeasureMarkerSymbol()));
        }
        messureGraphicsLayer.addGraphic(new Graphic(mPoints.get(mPoints.size() - 1), symbolFactory.createMeasureMarkerSymbol()));
        messureLine.setStart(mPoint);
        messureLine.setEnd(mPoints.get(0));
        messurePolyline.addSegment(messureLine, true);
        Graphic messureLineGraphic = new Graphic(messurePolyline, symbolFactory.createMeasureLineSymbol());
        Graphic messureAreaGraphic = new Graphic(messurePolygon, symbolFactory.createMeasureFillSymbol());//初始化面的要素
        messureGraphicsLayer.addGraphic(messureAreaGraphic);//将面的要素添加到图层
        messureGraphicsLayer.addGraphic(messureLineGraphic);
        messurePolygon.startPath(mPoint);//将当前点设为初始点
    }
            接下来就是要计算边长、周长和面积了。基本原则是这样的,用Line计算边长,用Polyline计算周长,用Polygon计算面积,计算时候也注意下最后一个边:

     if (mPoints.size() > 1) {
            messureLine.setStart(mPoints.get(mPoints.size() - 2));//将上一个点作为起始点
            messureLine.setEnd(mPoints.get(mPoints.size() - 1));//将该点作为终止点
            messurePolyline.addSegment(messureLine, true);//将线段加入到线段组
            Graphic messureLineGraphic = new Graphic(messurePolyline, symbolFactory.createMeasureLineSymbol());//将线段组变为线段要素
            TextSymbol ts = new TextSymbol(16,String.format("%.2f", messureLine.calculateLength2D())+"m",Color.BLACK);
            Polyline line=new Polyline();
            line.addSegment(messureLine,true);
            Graphic textGraphic=new Graphic(line,ts);
            listgraphic.add(textGraphic);
            for(Graphic graphic:listgraphic) {
                messureGraphicsLayer.addGraphic(graphic);
            }
            messureGraphicsLayer.addGraphic(messureLineGraphic);//将线段组要素添加到图层
            messureDistance += messureLine.calculateLength2D();//累计计算线段长度
            tvMessureResult.setText("长度:"+String.format("%.2f", messureDistance) + "m");//文本设置长度
            showMessureResult(tvMessureResult, mPoint);//显示出来
        }
        if (mPoints.size() > 2) {
            Line lastLine=new Line();
            lastLine.setStart(mPoints.get(mPoints.size() - 1));
            lastLine.setEnd(mPoints.get(0));
            Polyline lastPolyline=new Polyline();
            lastPolyline.addSegment(lastLine,true);
            TextSymbol ts = new TextSymbol(16,String.format("%.2f", lastPolyline.calculateLength2D())+"m",Color.BLACK);
            Graphic textGraphic=new Graphic(lastPolyline,ts);
            messureGraphicsLayer.addGraphic(textGraphic);
            double messureArea = messurePolygon.calculateArea2D();//计算面积
            tvMessureResult.setText("周长:"+String.format("%.2f", messureDistance+lastLine.calculateLength2D()) + "m"+"\n"+"面积:"+String.format("%.2f", Math.abs(messureArea)) + "㎡");//设置面积文本
            showMessureResult(tvMessureResult, mPoint);
        }
    



    展开全文
  • 为实现多边形薄片零件边长尺寸实时、非接触性测量,提出了一种基于机器视觉的多边形薄片零件边长尺寸测量方法。首先,利用Delaunay三角剖分内插值标定法得出世界坐标系与像素坐标系之间转换关系,运用CCD工业...
  •  给定一个数字k(k>=2),将多边形的边长平分成k份。  输出:k个点,这些点全部都是多边形上的。   我的思路如下:  先求出总长度,然后求出平均长度。  第一个点取输入的第一个顶点。  具体过程看我源代码...

    题目:

        在直角坐标系平面上,给定一些点(个数大于2),这些点组成一个多边形。

        给定一个数字k(k>=2),将多边形的边长平分成k份。

       输出:k个点,这些点全部都是多边形上的。

     

    我的思路如下:

        先求出总长度,然后求出平均长度。

       第一个点取输入的第一个顶点。

       具体过程看我源代码(Java):

     

    package com.learing.divingpolygon;

    public class PolygonDivider {

     /**
      * Divide input polygon into parts evenly by side length.
      * @param pts    Input points.
      * @param numOfParts  How many parts to be divided to.
      * @return null if failed, otherwise the points on polygon.
      */
     public static Point [] divide(Point [] pts, int numOfParts) {
      if (numOfParts <= 1 || pts == null || pts.length < 2) {
       return null;
      }
     
      // the part length.
      final float partLen = getDividingLen(pts, numOfParts);
     
      Point [] result = new Point[numOfParts];
     
      // set the first result point as pts[0].
      result[0] = pts[0];
     
      // count of currently found results.
      int count = 1;
     
      // index for source points.
      int sourceIndex = 1;
     
      // the current point from where to calculate.
      Point cur = pts[0];
     
      // accumulated length for current point calculation.
      float accumulated = 0.0f;
     
      while (true) {
       if (sourceIndex >= pts.length) {
        System.err.print("program error.");
        return null;
       }
       Point dest = pts[sourceIndex];
       float distance = getDistance(cur, dest);
       if (distance < partLen - accumulated) {
        cur = dest;
        accumulated += distance;
        ++sourceIndex;
       
        // the last segment 's target is the original point.
        // here the original point is set to the first point.
        if (sourceIndex == pts.length) {
         sourceIndex = 0;
        }
       } else {
        cur = getPointByDistance(cur, dest, partLen - accumulated);
        accumulated = 0.0f;
        result[count++] = cur;
        if (count == numOfParts) {
         break;
        }
       }
      }
     
      return result;
     }
     
     static float getDividingLen(Point [] pts, int numOfParts) {
      float sum = 0.0f;
      final int n = pts.length;
      for (int i = 1; i < n; ++i) {
       sum += getDistance(pts[i - 1], pts[i]);
      }
     
      float lastLen = getDistance(pts[n - 1], pts[0]);
      sum += lastLen;
      return sum / numOfParts;
     }
     
     /**
      * Get a float point on segment(from start to end) which satisfies that
      * the length between start and the point is len.
      * @param start
      * @param end
      * @param len
      * @return the point which satisfies
      * that the length between start and the point is len.
      */
     static Point getPointByDistance(Point start, Point end, float len) {
      // special occasion : vertical line, the slant ratio doesn't exist.
      if (start.x == end.x) {
       return new Point(start.x, end.y > start.y ? start.y + len : start.y - len);
      }
     
      final float slant = (end.y - start.y) / (end.x - start.x);
     
      // result point x:
      float x = end.x > start.x ?
        len / (float) Math.sqrt(1 + slant * slant) + start.x
        : -len / (float) Math.sqrt(1 + slant * slant) + start.x;
     
      // result point y:
      float y = start.y + slant * (x - start.x);
     
      return new Point(x, y);
     }

     private static float getDistance(Point pt1, Point pt2) {
      return (float) Math.hypot(pt2.x - pt1.x, pt2.y - pt1.y);
     }
     
    }

     

    测试代码如下:

      @Test
     public void testDividing() {
      Point pts[] = new Point[] {
        new Point(0, 0),
        new Point(10, 0),
        new Point(10, 10),
        new Point(0, 10),
      };
     
      Point [] result = PolygonDivider.divide(pts, 5);
     
      Assert.assertEquals(result.length, 5);
      Assert.assertEquals("assert equals", result[0].x, 0, 0.01f);
      Assert.assertEquals("assert equals", result[0].y, 0, 0.01f);
     
      Assert.assertEquals("assert equals", result[1].x, 8, 0.01f);
      Assert.assertEquals("assert equals", result[1].y, 0, 0.01f);
     
      Assert.assertEquals("assert equals", result[2].x, 10, 0.01f);
      Assert.assertEquals("assert equals", result[2].y, 6, 0.01f);
     
      Assert.assertEquals("assert equals", result[3].x, 6, 0.01f);
      Assert.assertEquals("assert equals", result[3].y, 10, 0.01f);
     
      Assert.assertEquals("assert equals", result[4].x, 0, 0.01f);
      Assert.assertEquals("assert equals", result[4].y, 8, 0.01f);
     }


     

     

    展开全文
  •  有一个多边形(可能是凹或凸),这个多边形的每条边都平行于坐标轴,且给出多边形所有顶点的坐标,每个顶点都是拐点(即连接该顶点的两边肯定相互垂直),现在要你输出该多边形的周长. 分析:  由于题目给出的该多边形的...

    POJ 1788 Building a New Depot(计算正多边形边长)

    http://poj.org/problem?id=1788

    题意: ZOJ 2157

           有一个多边形(可能是凹或凸),这个多边形的每条边都平行于坐标轴,且给出多边形所有顶点的坐标,每个顶点都是拐点(即连接该顶点的两边肯定相互垂直),现在要你输出该多边形的周长.

    分析:

           由于题目给出的该多边形的限制条件:平行坐标轴,每个点都是拐点. 那么可以得出结论:

    对于每个XY坐标,该坐标上多边形的顶点数目一定是偶数个.(假设x=5坐标有多个顶点,那么顶点数一定是偶数,比如2个或4个或6,不可能是奇数个)

           对于某个坐标值X(Y),如果该坐标值有偶数个点,那么该坐标上肯定有边,且从上到下相邻的两个点互连成边.如下图:

     

           对于上图,可以自己对于用例画画,验证一下.

           由上面两条结论,我们可以知道每个有多边形点的x或y坐标的边构造必然是: 坐标相邻的两个点连接成一条边即可,所以我们只要加上所有这些边即可.

           首先把所有点坐标按X值排序,算出同一X值上的所有竖直的边长.

           然后把所有点坐标按Y值排序,算出同一Y值上的所有水平的边长.

           所有边长相加输出周长即可.

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=100000+10;
    struct Point
    {
        int x,y;
    }P[maxn];
    bool compare_x(Point A,Point B)//升序排列
    {
        return A.x<B.x || (A.x==B.x&&A.y<B.y);
    }
    bool compare_y(Point A,Point B)
    {
        return A.y<B.y || (A.y==B.y&&A.x<B.x);
    }
    
    
    int main()
    {
        int n;
        while(scanf("%d",&n)==1 && n)
        {
            for(int i=0;i<n;++i) scanf("%d%d",&P[i].x,&P[i].y);
            int ans=0;
            sort(P,P+n,compare_x);
            for(int i=0;i<n;)
            {
                if(P[i].x==P[i+1].x)//计算竖直边
                {
                    ans += P[i+1].y-P[i].y;
                    i+=2;
                }
                else ++i;
            }
            sort(P,P+n,compare_y);
            for(int i=0;i<n;)
            {
                if(P[i].y==P[i+1].y)//计算水平边
                {
                    ans+= P[i+1].x-P[i].x;
                    i+=2;
                }
                else ++i;
            }
            printf("The length of the fence will be %d units.\n",ans);
        }
        return 0;
    }
    

    展开全文
  • n代表往外扩张几次,r代表圆的内接圆半径,k代表多边形的边长。问你每次扩张多边形和内接圆的面积之和。 公式: 多边形的面积公式 0.5*sin(2*3.1415926/n)*n*r*r.(r 代表园的外接圆半径)。 #includ...
  • *4.5(几何:正多边形的面积)正多边形是一个...编写一个程序,提示用户输入边的个数以及正多边形的边长,然后显示它的面积。 这里是一个运行示例: Enter the number of sides: 5 Enter the side: 6.5 The ar...
  • 为了一般化推导,这里设正多边形的边长为a。 当n为偶数时: 可以发现正方形的边长=对边之间的距离:tan(θ)=tan(π−πn2)=ans2a2\displaystyle tan(\theta)=tan(\frac{\pi-\frac{\pi}{n}}{2})=\frac{\frac{ans}{2...
  • 第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon) *6.36(几何:正多边形的面积)正多边形是一个n...编写一个main方法,提示用户输入边的个数以及正多边形的边长,然后显示它的面积。 下
  • *6.36(几何:正多边形的面积)正多边形是一个n条边的...编写一个main方法,提示用户输入边的个数以及正多边形的边长,然后显示它的面积。 下面是一个运行示例: Enter the number of sides: 5 Enter the side:6.5 Th
  • (1)问题描述 就是把一个n边凸多边形划分成全都化成三角形(n-2),然后算所有三角形的周长加起来总的最小的(公共弦得重复计算)。 (2)基本思路 最小的大凸多边形等于 “左子多边形... // n凸多边形的边长 privat...
  • 多边形面积计算

    万次阅读 2017-12-21 18:02:01
    但是,这种方法程序实现起来比较复杂,因为无法预知多边形的形状,需要判断多边形的“凸凹”,才能避免重复计算。另外,计算边长的计算量也比较大。本文采用“鞋带公式”计算。编程简单,计算量小,优势明显。 ,
  • L:正多边形的边长 α:旋转角度的二分之一(旋转角度=多边形相邻的两条边长的各自的垂直平分线的交点所在的夹角) R = L /(2*tanα) <!DOCTYPE html> <html lang="en"> <head> <meta ...
  • 找一找其中的规律,循环次数代表边数,移动步数代表边长,而右转度数x循环次数=360°(360°为任意凸多边形的外角和),存在差异的只是边数和边长,能否将这种差异整合在一起呢?要是有这样的一块积木就好了。这个...
  • SQRT函数用于计算数值的平方根,今天我们这个案例是根据正方形的面积计算正方形的边长。下面我们一起来了解一下SQRT函数的功能、语法以及参数解释。SQRT函数 函数功能 SQRT函数用于返回正平方根。 函数语...
  • 最后再搭配动画的效果,变成正多边形的变换动画,也由于正多边形需要用到不少的三角函数计算,为了方便起见,这里将正多边形的边统一都设为100px。 正三角形 正三角形不需要用到伪元素,只需要设定div本身的边框宽度...
  • ”正多边形的逼近“求π的近似值

    千次阅读 2016-12-11 22:29:35
    突然碰到这道题,如图 ...由于圆的周长近似认为等于内接正多边形的周长(正多边形边数越大,越接近),所以就可以求出π了已下是代码:# include # include<math.h>int main() { //=======================定义
  • 24.3 正多边形和圆教学设计教学目标了解正多边形和圆的有关概念;...(2)从你身边举出两三个正多边形的实例,正多边形具有轴对称、中心对称吗?其对称轴有几条,对称中心是哪一点?2.自主学习:自学教材P1...
  • 基于python OpenCV多边形图像识别实现

    千次阅读 多人点赞 2020-10-06 16:07:38
    首先说一下我整体思路: ① 首先定义了一个识别器类型,封装了计算边长,识别形状和展示...④ 用之前创建识别器实例对每个轮廓中点进行多边形拟合,得到顶点坐标列表中去(class中28~32行代码) ⑤ 输出识别结
  • 多边形,中心到各边向量Vi,一条一条,拿出来,再重新拼接成一个同样边数多边形(除了正6边形外,其他情况,2个正多边形边长是不一样) 每个向量(vi)之间夹角和,正好是2pi,意味着这些向量正好转了一圈...
  • 纯粹利用CSS,让“单一个”div,从正三角形变换为正八边形(单一div最多只能做到正八边形),最后再搭配动画的效果,变成正多边形的变换动画,也由于正多边形需要用到不少的三角函数计算,为了方便起见,这里将正...
  • 求pai近似值

    千次阅读 2017-05-17 21:36:44
    求pai的近似值: 利用正多边形逼近的方法求pai值。...设圆的内接多边形的边长为2b,边数为i,则边数乘以2后的新正多边形的边长: x = 0.5 * sqrt(2 - 2 * sqrt(1 - b * b)); 周长为: y = 2 * i *x; 程序: #in
  • 纯粹利用CSS,让“单一个”div,从正三角形变换为正八边形(单一div最多只能做到正八边形),最后再搭配动画的效果,变成正多边形的变换动画,也由于正多边形需要用到不少的三角函数计算,为了方便起见,这里将正...
  • 原理:一个正多边形有n条边,正多边形的内角和为 (n−2)∗180\left( {n – 2} \right)*180(n−2)∗180,那么每个角的度数则为 180+360n180 + \frac{{360}}{n}180+n360​,所以每个角的角度是360n\frac{{360}}{n}n360...
  • 多边形的面积可通过分割成很多个三角形面积之和来求得! 通过多边形各顶点坐标可以求得各边长,再采用海伦公式,计算分割后的小三角形的面积。 海伦公式如下: 假设在平面内,有一个三角形,边长分别为...
  • 前几天导师给了个基于三角形网格的二重积分计算题,...那就是 polyarea()函数,利用这个函数就可以轻而易举的求出任意多边形的面积了。举个简单的例子:如下求一个三角形的面积。只需输入下述MATLAB代码x = [0 1 ...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 313
精华内容 125
关键字:

多边形的边长