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

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - 小白天地

从今日起重新开张!!! 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类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击这里下载。