用户操作
[即时聊天] [发私信] [加为好友]
潘宇光ID:superdullwolf
32463次访问,排名3601好友34人,关注者268
超级大笨狼,每天要自强。
superdullwolf的文章
原创 53 篇
翻译 0 篇
转载 0 篇
评论 65 篇
最近评论
devoc:很厉害哦你
devoc:晕,怎么点三下就发了三了次哦。麻烦lz删两个哈~
devoc:晕,怎么点三下就发了三了次哦。麻烦lz删两个哈~
devoc:晕,怎么点三下就发了三了次哦。麻烦lz删两个哈~
devoc:受教了
文章分类
收藏
    相册
    偶的照片
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 成功研究出多边形的碰撞检测算法收藏

    新一篇: 传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法 | 旧一篇: 我起草的网站运营建设总监面试话题,希望业内同僚互相启发.

     
    <html   xmlns:v= "urn:schemas-microsoft-com:vml ">
    <STYLE>
    v\:*   {   Behavior:   url(#default#VML)   }
    </STYLE>


    <BODY   style= "margin:0;padding:0; ">  

    <span   id= 'sss '   style= 'position:absolute;top:0;left:0; '>   </span>
    <span   id= 'aaa '   style= 'position:absolute;top:0;left:500; '>   </span>
     
    <v:PolyLine   id= 'thePolygonA '   CoordOrig= "0,0 "   filled= 'true '   Points= '97,88,70,96,16,83,66,6,97,88 '   style= 'position:absolute;top:0;left:0; '   fillcolor= 'red '   onmousedown=MouseDown(this)   onmousemove=MouseMove()   onmouseup=MouseUp()   />  
    <v:PolyLine   id= 'thePolygonB '   CoordOrig= "0,0 "   filled= 'true '   Points= '109,260,207,112,246,101,230,297,109,260 '   style= 'position:absolute;top:0;left:0; '   fillcolor= 'blue '   onmousedown=MouseDown(this)   onmousemove=MouseMove()   onmouseup=MouseUp()   />  

    <script     LANGUAGE= "javaScript ">
     
     
    var     PolygonA=new   Array(new   Array(97,88),new   Array(70,96),new   Array(16,83),new   Array(66,6),new   Array(97,88));
    var     PolygonB=new   Array(new   Array(109,260),new   Array(207,112),new   Array(246,101),new   Array(230,297),new   Array(109,260)   );  

    //用来计算的临时数组,由于数组是引用类型,所以不能克隆,只能另外准备一个。
    var     tempPolygonA=new   Array(new   Array(97,88),new   Array(70,96),new   Array(16,83),new   Array(66,6),new   Array(97,88));
    var     tempPolygonB=new   Array(new   Array(109,260),new   Array(207,112),new   Array(246,101),new   Array(230,297),new   Array(109,260)   );    
    var   Obj
     

    function   MouseDown(obj){
    Obj=obj;
    Obj.setCapture();
    Obj.l=event.x-Obj.style.pixelLeft;
    Obj.t=event.y-Obj.style.pixelTop;  
     
    }
     
    function   MouseMove(){

    if(Obj!=null)
    {
    offsetx=parseInt(event.x-Obj.l);
    offsety=parseInt(event.y-Obj.t);
    Obj.style.left   =   offsetx;
    Obj.style.top   =   offsety;

    if(Obj.id== "thePolygonA ")
    {  
    for(var   i=0;i <PolygonA.length;i++)
    {  
    tempPolygonA[i][0]=PolygonA[i][0]+offsetx;
    tempPolygonA[i][1]=PolygonA[i][1]+offsety;  
    }
    }
    if(Obj.id== "thePolygonB ")
    {
    for(var   j=0;j <PolygonB.length;j++)
    {  
    tempPolygonB[j][0]=PolygonB[j][0]+offsetx;
    tempPolygonB[j][1]=PolygonB[j][1]+offsety;  
    }
    }
      sss.innerHTML=   tempPolygonA   +   " <br> "   +   tempPolygonB+   " <br> "   +isCollapse(tempPolygonA,tempPolygonB)  
     
    }
    }
     
    function   MouseUp(){
    if(Obj!=null){
    Obj.releaseCapture();
    Obj=null
    }
    }
      //alert(isPointInPolygon(222,243,PolygonB))
    function   isPointInLine(x,y,x1,y1,x2,y2)
    {
    //是否一个点向x轴的射线穿透线段,有交点
    var   maxY=(y1> =y2)?y1:y2;
    var   minY=(y1 <=y2)?y1:y2;
    var   re=false;
    if(y <=maxY   &&   y> =minY)
    {
    if(x <=   (   x1+(x2-x1)*(y-y1)/(y2-y1)   )   )
    {
    re=true;
    }
    }
    return(re);
     
    }
      //109,260,207,112,246,101,230,297,109,260


    function   isPointInPolygon(x,y,Polygon)
    {//是否点在多边形里  
      var   crossNum=0;
      var   re=true;
      for(var   i=0;i <Polygon.length-1;i++)
      {
    if(isPointInLine(x,y,Polygon[i][0],Polygon[i][1],Polygon[i+1][0],Polygon[i+1][1]))
    {
    crossNum++;
    }
      }

      if((crossNum   %   2)==0)
    {
    re=false;
      }
      return(re);
    }

    function   isCollapse(P1,P2)
    {
    //是否多边形碰撞。
    aaa.innerHTML= " ";
    var   re=false;
    for(var   i=0;i <P1.length-1;i++)
    {
    if(isPointInPolygon(P1[i][0],P1[i][1]   ,P2))
    {
    aaa.innerHTML= "碰撞点为: "   +   P1[i][0]   +   "   "   +   P1[i][1]
    return(true);
    }
    }
    for(var   j=0;j <P2.length-1;j++)
    {

    if(isPointInPolygon(P2[j][0],P2[j][1]   ,P1))
    {
      aaa.innerHTML= "碰撞点为: "   +   P2[j][0]   +   "   "   +   P2[j][1]
    return(true);  
    }
    }
    return(re);
    }

    </script>
     
     
    </BODY>
    </HTML>

    发表于 @ 2008年07月22日 17:19:00|评论(loading...)|收藏

    新一篇: 传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法 | 旧一篇: 我起草的网站运营建设总监面试话题,希望业内同僚互相启发.

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 潘宇光