多变形的中心点

 
public class Logic
{
    private static readonly double eps = 1e-10;
    public static Point FindFermat(List<Point> poly, double step = 10)
    {
        if (poly == null || poly.Count == 0) return null;
        if (poly.Count == 1) return poly[0];
        if (poly.Count == 2) return new Point() { x = (poly[0].x + poly[1].x) / 2, y = (poly[0].y + poly[1].y) / 2 };
        Point basePoint = new Point() { x = poly[0].x, y = poly[0].y };

        double ans = AllDistance(poly[0].x, poly[0].y, poly);
        double a = poly[0].x, b = poly[0].y;
        double ta = a, tb = b, temp = 0;
        while (step > eps)
        {
            bool flag = true;
            while (flag)
            {
                flag = false;
                temp = AllDistance(a + step, b, poly);
                if (temp < ans)
                {
                    flag = true;
                    ans = temp;
                    ta = a + step;
                    tb = b;
                }
                temp = AllDistance(a - step, b, poly);
                if (temp < ans)
                {
                    flag = true;
                    ans = temp;
                    ta = a - step;
                    tb = b;
                }
                temp = AllDistance(a, b + step, poly);
                if (temp < ans)
                {
                    flag = true;
                    ans = temp;
                    ta = a;
                    tb = b + step;
                }
                temp = AllDistance(a, b - step, poly);
                if (temp < ans)
                {
                    flag = true;
                    ans = temp;
                    ta = a;
                    tb = b - step;
                }
                a = ta;
                b = tb;
            }
            step *= 0.5;
        }
        return new Point() { x = a, y = b };
    }
    private Point Move(Point p, Point direct)
    {
        return new Point()
        {
            x = p.x + direct.x,
            y = p.y + direct.y
        };
    }

    private static double AllDistance(double tx, double ty, List<Point> pList)
    {
        double ans = 0;
        foreach (var point in pList)
        {
            ans += Distance(new Point() { x = tx, y = ty }, point);
        }
        return ans;
    }

    private static double Distance(Point a, Point b)
    {
        return Math.Sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }

    private const double EARTH_RADIUS = 6378.137;
    private static double rad(double d)
    {
        return d * Math.PI / 180.0;
    }

    /// <summary>
    /// 点到点间的距离
    /// </summary>
    /// <param name="lat1"></param>
    /// <param name="lng1"></param>
    /// <param name="lat2"></param>
    /// <param name="lng2"></param>
    /// <returns></returns>
    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
    {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
         Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.Round(s * 10000) / 10000;
        return s;
    }
}

时间: 2024-10-09 22:15:23

多变形的中心点的相关文章

CSS#提供的变形支持

transform:该属性设置HTML组件横向上移动tx距离,纵向上移动ty距离.其中ty参数可以省略,如果省略ty参数,则ty默认为0 translate(tx,ty):该函数设置HTML组件横向上移动tx个距离,纵向上移动ty距离. translateX:该函数设置HTML组件横向上移动tx个距离. translateY:该函数设置HTML组件横向上移动ty距离. scale(sx,sy):该函数设置HTML组件横向上缩放比例为sx,纵向上缩放比例为sy. scaleX: scaleY: r

前端笔记十三,变形与动画相关属性

transform transform:设置变形:需添加浏览器前缀-o-;-webkit-;-moz-等:有如下变形函数 translate(tx [,ty]):组件横向上移tx,纵向上移ty距离 translateX(tx):组件横向上移动tx距离 translateY(ty):组件纵向上移动ty距离 scale(sx,sy):横向上缩放比例为sx,纵向上缩放比例为sy:sy省略情况下默认等于sx scaleX(sx):只在横向上进行缩放,缩放比例为sx scaleY(sy):只在纵向上进行缩

HTML5-CSS3-JavaScript(4)

CSS3中 变形与动画相关属性 CSS3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的功能.CSS3的变形功能可以对HTML组件执行位移.旋转.缩放.倾斜4种几何变换,这样的变换可以控制HTML组件呈现出更丰富的外观. 借助于位移.旋转.缩放.倾斜这4种几何变换,CSS3提供了Transition动画.Transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画的持续时间,就可保证HTML组件

CSS3 transform介绍 (简书)

transform本质上是一系列变形函数,分别是translate位移,scale缩放,rotate旋转,skew扭曲,matrix矩阵. 前置属性: transform-origin transform-style perspective perspective-origin backface-visibility 2D变形: translate scale rotate skew matrix 3D变形: translate3d scale3d rotate3d matrix3d 层级影响

CSS3学习手记

--------------------CSS3新增选择器--------------------#E:nth-child(n):匹配元素类型为E且是父元素的第n个子元素#E:nth-last-child(n):匹配元素类型为E且是父元素的倒数第n个子元素(与上一项顺序相反)#E:first-child:匹配元素类型为E且是父元素的第一个子元素#E:last-child:匹配元素类型为E且是父元素的最后一个子元素#E:only-child:匹配元素类型为E且是父元素中唯一的子元素#E:nth-o

前端总结的学习笔记

血的教训 当用li标签包裹住a标签,鼠标经过,让其它元素显示时.要写li:hover   div{各种样式}而不能写ul li  a:hover  div{各种样式} 事件代理:为后来添加的元素添加上事件,优化引擎 - Gecko内核   css前缀为"-moz-"  火狐浏览器 - Presto内核   css前缀为"-o-"             Opera(欧朋) - Trident内核 css前缀为"-ms-"           IE

#考研笔记#计算机问答题

1.什么是计算机的 IP 地址?有哪些组成部分?每个部分标识的对象是什么? 答:每台计算机区别于其他计算机的唯一地址.网络地址:区分物理子网:主机子网:同一物理子 网不同计算机和网络设备 2.什么是 URL?它的作用是什么?端口应用的目的是什么? 答: 统一资源定位器为页面的世界性名称.解决三个问题:页面文件叫什么? 页面在哪里?如何访问页面?为不同资源的统一访问方法定义的地址标识方法 端口应用目的: 解决一个 IP 地址提供多种服务的问题, 每一种服务都有其默认的端口号[HTTP 标准 80,

Python开发【前端篇】HTML5+CSS3

CSS权重 CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 权重的等级 可以把样式的应用方式分为几个等级,按照等级来计算权重 1.!important,加在样式属性值后,权重值为 100002.内联样式,如:style=””,权重值为10003.ID选择器,如:#content,权重值为1004.类,伪类和属性选择器,如: content.:hover 权重值为105.标签选择器和伪元素选择器,如:div.p

前端——基础

HTML html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写 意思是超文本标记语言, 超文本指的是超链接, 标记指的是标签 html注释 <!-- 这是一段注释 --> html标题标签 <h1>这是一级标题</h1> <h2>这是二级标题</h2> <h3>这是三级标题</h3> html段落标签.换行标签与字符实体 html段落标签 <p>一