某公司的一道机考题的解答

简介: 昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。    关于这个问题,我给出了自己的答案,首先解决第一个问题:            ///         /// IsTriangle 判断集合中的头三个点PointF是...

     昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。
    关于这个问题,我给出了自己的答案,首先解决第一个问题:
   

        ///   <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 ;

       ctor#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

        
Area ,GetEdgeLength#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


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

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

        
#endregion

    }


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

 

 

目录
相关文章
|
13天前
|
网络协议 网络虚拟化 数据安全/隐私保护
软考网工—华为命令总结
软考网工—华为命令总结
|
5月前
|
消息中间件 缓存 监控
直呼内行!阿里大佬离职带出内网专属“高并发系统设计”学习笔记
我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。
|
10月前
|
数据库
第一次机房收费系统之下机
第一次机房收费系统之下机
84 0
|
传感器 监控 机器人
关于现目前扫地机器中高端技术的个人思考
关于现目前扫地机器中高端技术的个人思考
100 0
关于现目前扫地机器中高端技术的个人思考
|
Java 关系型数据库 MySQL
阿里云学生机使用感想
阿里云学生机使用体验
|
编解码
分享一些自用软件,学妹们用了都说好用!
今天我给大家分享一些我平时自用的软件,有学习的、编程的、娱乐的、工具类的等等。 有些软件是破解版的,去除了广告,都很实用
159 0
分享一些自用软件,学妹们用了都说好用!
|
定位技术 SEO
【号外】-网站时光机
有些东西也只能留在时光机中了
【号外】-网站时光机
|
存储 运维 大数据
刀片服务器在尴尬中期待破局 谁能给出最佳的答案?
刀片服务器在尴尬中期待破局 谁能给出最佳的答案?
刀片服务器在尴尬中期待破局 谁能给出最佳的答案?
|
机器学习/深度学习 人工智能 监控
“老板狗腿”AI上线!这款软件能潜入电脑,远程监工评绩效,还分分钟给老板打小报告
“老板狗腿”AI上线!这款软件能潜入电脑,远程监工评绩效,还分分钟给老板打小报告
155 0
|
Web App开发 安全 Windows
微博疯传电脑提速“秘技” 360安全专家称纯属忽悠
 近来,一则为Windows XP用户提升网速的“电脑小技巧”风靡网上,在各大微博被转发数万次。该文称:“Windows XP自动保留了20%的网速,通过一定设置取消带宽限制,就可以使用100%的网速”。
857 0