守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1076|回复: 3

[算法/性能优化] 拟合直线算法

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51664
    钢镚
    1422

    开源英雄守望者

    发表于 2015-3-2 09:45:29 | 显示全部楼层 |阅读模式
    从网上找的一个,


    直接上代码:


    DynamicDrawer.as

    1. package
    2. {
    3.         //
    4.         /**
    5.          * simple2d.draw.DynamicDrawer
    6.          *
    7.                 本类用于动态绘制某些shape
    8.         */
    9.        
    10.         import flash.display.Sprite;
    11.         import flash.geom.Rectangle;
    12.        
    13.         public class DynamicDrawer{
    14.                
    15.                 public function DynamicDrawer(){
    16.                         throw Error("Error: org.vily.utils.draw.DynamicDrawer是静态类,不能创建实例");
    17.                 }
    18.                
    19.                 public static function createByVS(arr:Array):Rectangle {
    20.                         var rect:Rectangle = null;
    21.                         if (arr != null && arr.length > 0) {
    22.                                 var len:int = arr.length;
    23.                                 rect = new Rectangle();
    24.                                 var minV:Object = { x:arr[0].x, y:arr[0].y };
    25.                                 var maxV:Object = { x:arr[0].x, y:arr[0].y };
    26.                                 for (var i:int = 1; i < len; i++ ) {
    27.                                         if (arr[i].x < minV.x) {
    28.                                                 minV.x = arr[i].x;
    29.                                         }else if (arr[i].x > maxV.x) {
    30.                                                 maxV.x = arr[i].x;
    31.                                         }
    32.                                         //
    33.                                         if (arr[i].y < minV.y) {
    34.                                                 minV.y = arr[i].y;
    35.                                         }else if (arr[i].y > maxV.y) {
    36.                                                 maxV.y = arr[i].y;
    37.                                         }
    38.                                 }
    39.                                 rect.x = minV.x;
    40.                                 rect.y = minV.y;
    41.                                 rect.width = maxV.x - minV.x;
    42.                                 rect.height = maxV.y - minV.y;
    43.                         }
    44.                         return rect;
    45.                 }
    46.                 public static function clear(spr:Sprite):void{
    47.                         spr.graphics.clear();
    48.                 }
    49.                
    50.                 /**
    51.                         绘制包含边框和填充的矩形
    52.                 */
    53.                 public static function drawRect(spr:Sprite,rect:Rectangle,thickness:Number = 1.0, l_color:uint = 0x0,l_alphaNum:Number = 0.5, color:uint = 0x0,alphaNum:Number = 0.5):void{
    54.                         //spr.graphics.clear();
    55.                         spr.graphics.lineStyle(thickness,l_color,l_alphaNum)
    56.                         spr.graphics.beginFill(color,alphaNum);
    57.                         spr.graphics.drawRect(rect.x,rect.y,rect.width,rect.height);
    58.                         spr.graphics.endFill();
    59.                 }
    60.                
    61.                 //绘制直线
    62.                 public static function drawLine(spr:Sprite,posA:Object,posB:Object,thickness:Number = 1.0, l_color:uint = 0x0,l_alphaNum:Number = 0.5):void{
    63.                        
    64.                         spr.graphics.lineStyle(thickness,l_color,l_alphaNum);
    65.                         spr.graphics.moveTo(posA.x, posA.y);
    66.                         spr.graphics.lineTo(posB.x, posB.y);                       
    67.                 }
    68.         }
    69. }
    复制代码


    Main.as

    1. package
    2. {
    3.         import flash.display.Sprite;
    4.         import flash.events.Event;
    5.         import flash.geom.Rectangle;
    6.         //
    7.         /**
    8.          * ...
    9.          * @author vilylei
    10.          */
    11.         public class Main extends Sprite
    12.         {
    13.                
    14.                 public function Main():void
    15.                 {
    16.                         if (stage) init();
    17.                         else addEventListener(Event.ADDED_TO_STAGE, init);
    18.                 }               
    19.                
    20.                 private function init(e:Event = null):void
    21.                 {
    22.                         removeEventListener(Event.ADDED_TO_STAGE, init);
    23.                         // entry point
    24.                         // 创建数据
    25.                         var rect:Rectangle = new Rectangle(100, 50, 200, 200);
    26.                         var vs:Array = [];
    27.                         var len:int = 6;
    28.                         for (var i:int = 0; i < len; i++) {
    29.                                 vs.push( { x:rect.x + Math.random() * rect.width, y:rect.y + Math.random() * rect.height } );
    30.                                 var tr:Rectangle = new Rectangle();
    31.                                 tr.x = vs[i].x - 2;
    32.                                 tr.y = vs[i].y - 2;
    33.                                 tr.width = 4;
    34.                                 tr.height = 4;
    35.                                 DynamicDrawer.drawRect(this, tr);
    36.                         }
    37.                        
    38.                         var pa:Object = { x:0, y:0 };
    39.                         var pb:Object = { x:0, y:0 };
    40.                         linearFitting(vs, len, pa, pb);
    41.                         DynamicDrawer.drawLine(this,pa,pb,2.0,0xff0000);
    42.                 }
    43.                 //
    44.                 /*
    45.                  * 直线拟合实现
    46.                  * @param                        vs        是一个数组,包含若干待计算点(每一个点是{x:0,y:0}型的Object的对象)
    47.                  * @param                        len        是vs数组的长度
    48.                  * @param                        pa        是一个as3 Object对象->{x:0,y:0},是计算出来线段的第一个端点
    49.                  * @param                        pb        是一个as3 Object对象->{x:0,y:0},是计算出来线段的第二个端点
    50.                  * **/
    51.                 private function linearFitting(vs:Array,len:int,pa:Object, pb:Object):void {
    52.                         var A:Number = sumVSY( vs );
    53.                         var B:Number = sumVSX( vs );
    54.                         //
    55.                         var C:Number = sumVSXMultY( vs );
    56.                         var D:Number = sumVSXMultX( vs );
    57.                        
    58.                         // 计算出直线的参数k和b(基于:y= k*x + b)
    59.                         var k:Number = (A * B - len * C) / (B * B  - len * D);
    60.                         var b:Number = (B * C - A * D) / (B * B - len * D);
    61.                         //
    62.                         var fr:Rectangle = DynamicDrawer.createByVS(vs);
    63.                         pa.x = fr.x;
    64.                         pb.x = fr.right;
    65.                         pa.y = k * pa.x + b;
    66.                         pb.y = k * pb.x + b;
    67.                 }
    68.                 private function sumVSY(vs:Array):Number {
    69.                         var len:int = vs.length;
    70.                         var tem:Number = 0;
    71.                         for (var i:int = 0; i < len; i++) {
    72.                                 tem += vs[i].y;
    73.                         }
    74.                         return tem;
    75.                 }
    76.                 private function sumVSX(vs:Array):Number {
    77.                         var len:int = vs.length;
    78.                         var tem:Number = 0;
    79.                         for (var i:int = 0; i < len; i++) {
    80.                                 tem += vs[i].x;
    81.                         }
    82.                         return tem;
    83.                 }
    84.                 private function sumVSXMultY(vs:Array):Number {
    85.                         var len:int = vs.length;
    86.                         var tem:Number = 0;
    87.                         for (var i:int = 0; i < len; i++) {
    88.                                 tem += vs[i].x * vs[i].y;
    89.                         }
    90.                         return tem;
    91.                 }
    92.                 private function sumVSXMultX(vs:Array):Number {
    93.                         var len:int = vs.length;
    94.                         var tem:Number = 0;
    95.                         for (var i:int = 0; i < len; i++) {
    96.                                 tem += vs[i].x * vs[i].x;
    97.                         }
    98.                         return tem;
    99.                 }
    100.                 //
    101.         }
    102.        
    103. }
    复制代码



    源码:

    游客,如果您要查看本帖隐藏内容请回复

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-2-13 14:44
  • 签到天数: 382 天

    [LV.9]以坛为家II

    21

    主题

    57

    帖子

    4万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    1056
    贡献
    0
    金币
    6354
    钢镚
    21
    发表于 2015-3-2 14:58:47 | 显示全部楼层
    感謝高水平分享
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    28

    积分

    新兵

    Rank: 1

    威望
    0
    贡献
    0
    金币
    23
    钢镚
    0
    发表于 2015-3-2 15:12:06 | 显示全部楼层
    感谢分享,感觉网站有点不稳定

    评分

    参与人数 1金币 +20 收起 理由
    破晓 + 20 嗯,确实

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-24 01:34
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    38

    帖子

    868

    积分

    上士

    Rank: 5Rank: 5

    威望
    20
    贡献
    0
    金币
    14
    钢镚
    0
    发表于 2019-2-24 02:54:43 | 显示全部楼层
    感谢分享!~
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-7-22 07:39 , Processed in 0.045373 second(s), 35 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表