惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
T
Tor Project blog
T
Threatpost
NISL@THU
NISL@THU
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
K
Kaspersky official blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
小众软件
小众软件
Recorded Future
Recorded Future
B
Blog RSS Feed
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
L
Lohrmann on Cybersecurity
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
爱范儿
爱范儿
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Hacker News: Front Page
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
Scott Helme
Scott Helme
V2EX - 技术
V2EX - 技术

博客园 - 小白天地

从今日起重新开张!!! D3D坐标系统和几何-DirectX Griaphic学习〔转载〕 重新开始我的blog内容! 关于Java栈与堆的思考[zz] MVC模式〔zz〕 google电话面试经历 面试英语_zt 指针和数组(C++)(zz) C#相关算法(zz) 设计模式的点滴[zz] 30分钟学会STL [zz] STL实践指南[zz] PHP的HTML文字编辑器 [zz] C#数据库类(zz) asp.net遍历控件的实现[zz] - 小白天地 - 博客园 C/C++的泪水![zz] 程序员数据结构笔记[zz] - 小白天地 - 博客园 百度之星程序设计大赛[zz] Asp.net与SQL一起打包部署安装[zz]
某公司的一道机考题的解答[zz]
小白天地 · 2005-10-19 · via 博客园 - 小白天地

http://www.cnblogs.com/zhuweisky/archive/2005/10/16/255836.html
   从武汉转战到广州,现在正在广州找工作,昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。
    关于这个问题,我给出了自己的答案,首先解决第一个问题:
   

        /// <summary>
        
/// IsTriangle 判断集合中的头三个点PointF是否可以构成一个三角形
        
/// </summary>        
        public static bool IsTriangle(ArrayList ptList)
        {
           
 PointF pt0 = (PointF)ptList[0] ;
            PointF pt1 
= (PointF)ptList[1] ;
            PointF pt2 
= (PointF)ptList[2] ;

             //如果有两个点相同

if(pt0.Equals(pt1) || pt0.Equals(pt2) || pt1.Equals(pt2) )
            {
                
return false ;
            }
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
            
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
            
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;bool result0 = (length_01+length_02 <= length_12)  ;
            
bool result1 = (length_01+length_12 <= length_02)  ;
            
bool result2 = (length_02+length_12 <= length_01)  ;if(result0 || result1 || result2)
            {
                
return false ;
            }
return true ;
        }

    该解答分为两步,首先判断是否有重点,接着以两边之和大于第三边作为构成三角形的依据。

    关于第二个问题稍微复杂些,不过幸好我在早期研究过并解决了一个更常见的问题,那就是判断一个点是否位于某个多边形内,而且即使这个多边形是凹多边形。这个功能在EnterpriseServerBase.XMath.Geometry.Polygon类中实现。
    对于问题二的解答,我封装了Triangle类,它不仅借助Polygon类解决了问题二,而且可以计算三角形的面积和各个边长。

public class Triangle
{
        
private ArrayList vertextList = null ;
        
private ArrayList lengthList  = null ;
        
private float myArea = 0 ;

       #region ctor
        
public Triangle(ArrayList ptList)
        
{            
            
if(! GeometryHelper.IsTriangle(ptList))
            
{
                
throw new ArgumentException("The points in list can't construct a triangle !") ;
            }


            
this.vertextList = ptList ;
            
this.FillLengthList() ;
        }


        
public Triangle(PointF pt0 ,PointF pt1 ,PointF pt2)
        
{    
            ArrayList ptList 
= new ArrayList() ;
            ptList.Add(pt0) ;
            ptList.Add(pt1) ;
            ptList.Add(pt2) ;

            
if(! GeometryHelper.IsTriangle(ptList))
            
{
                
throw new ArgumentException("The points in list can't construct a triangle !") ;
            }


            
this.vertextList = ptList ;
            
this.FillLengthList() ;
        }


        
private void FillLengthList()
        
{
            PointF pt0 
= (PointF)this.vertextList[0] ;
            PointF pt1 
= (PointF)this.vertextList[1] ;
            PointF pt2 
= (PointF)this.vertextList[2] ;        

            
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
            
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
            
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;

            
this.lengthList = new ArrayList() ;
            
this.lengthList.Add(length_12) ;
            
this.lengthList.Add(length_02) ;
            
this.lengthList.Add(length_01) ;
        }


        
#endregion

        
#region Area ,GetEdgeLength
        
/// <summary>
        
/// Area 三角形的面积
        
/// </summary>        

        public float Area
        
{
            
get
            
{
                
if(this.myArea == 0)
                
{
                    
this.myArea = this.GetArea() ;
                }


                
return this.myArea ;
            }

        }
        

        
private float GetArea()
        
{
            
float len0 = (float)this.lengthList[0] ;
            
float len1 = (float)this.lengthList[1] ;
            
float len2 = (float)this.lengthList[2] ;

            
float p = (len0 + len1 + len2) * 0.5f ;

            
return (float)Math.Sqrt(p * (p-len0) * (p-len1) * (p-len2)) ;
        }



        
public float GetEdgeLength(int index)//0<= index <=2
        {
            
if((index <0||(index >2))
            
{
                
return 0 ;
            }


            
return (float)this.lengthList[index] ;
        }

        
#endregion


        
#region Contains
        
/// <summary>
        
/// Contains 判断某点是否在三角形内部
        
/// </summary>        

        public bool Contains(PointF pt)
        
{
            Polygon poly 
= new Polygon(this.vertextList) ;
            
            
return poly.Contains(pt) ;
        }

        
#endregion

    }


    Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击这里下载。