`
琛哥哥
  • 浏览: 30278 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

计算两条线的交点,以及判断一个点是否在直线上

 
阅读更多
写的小例子,备份
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600" creationComplete="init()">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			
			//存放鼠标电击的点,最多存放2个
			private var clickPoint:Array = [];
			//存放画线的点.
			private var pointArray:Array = [];
			
			
			private function init():void{
				

			}
			
			//判断p是否在p1,p2组成的线段上.
			private function isOnLine(p:Point,p1:Point,p2:Point):Boolean{
				//根据数学,求出直接的表达示:y=kx+b
				var k:Number = (p1.y-p2.y)/(p1.x-p2.x);
				var b:Number = p1.y-k*p1.x;
				
				//将点的x坐标代入表达示中,判断该点是否在直线上
				var py:Number = p.x*k+b;
				var value:Number = p.y-py;
				
				if(value>-0.01&&value<0.01){
					return true;
				}else{
					return false;
				}
			}
			
			//画布区域的点击事件
			private function click(event:MouseEvent):void{
				var p:Point = new Point(event.localX,event.localY);
				//存放鼠标点击的坐标
				clickPoint.push(p);
				if(clickPoint.length>1){
					var length:int = clickPoint.length;
					startPoint.text = clickPoint[length-2].x + "," +clickPoint[length-2].y;
					endPoint.text = p.x + "," +p.y;
					
					if(length>2){
						clickPoint.shift();
					}
				}else{
					startPoint.text = p.x + "," +p.y;
				}
				
//				var p:Point = new Point(event.localX,event.localY);
//				
//				var p1:Point = new Point(0,0);
//				var p2:Point = new Point(100,100);
//				
//				
//				var result:Boolean = isOnLine(p,p1,p2);
//				
//				trace(p.x+","+p.y);
//				trace(result);
				//Alert.show(result.toString());
			}
			
			//计算p1,p2组成的线段和p3,p4组成的线段的交点
			private function getHitPoint(p1:Point,p2:Point,p3:Point,p4:Point):Point{
				//根据数学,求出直接的表达示:y=kx+b
				var p:Point = null;
				
				//两条线均不与Y轴平行
				if(p1.x!=p2.x&&p3.x!=p4.x){
					var k1:Number = (p1.y-p2.y)/(p1.x-p2.x);
					var b1:Number = p1.y-k1*p1.x;
					
					var k2:Number = (p3.y-p4.y)/(p3.x-p4.x);
					var b2:Number = p3.y-k2*p3.x;
					
					//两条线平行
					if(k1 == k2) return null;
					
					p = new Point;
					p.x = -(b1-b2)/(k1-k2);
					p.y = (k1*b2-k2*b1)/(k1-k2);
					
				}else{
					var k:Number;
					var b:Number;
					//经过p1,p2的直线与y轴平行,
					if(p1.x == p2.x && p3.x!=p4.x){
						k = (p3.y-p4.y)/(p3.x-p4.x);
						b = p3.y-k*p3.x;
						
						p = new Point;
						p.x = p1.x;
						p.y = k*p.x+b;
						
					}else if(p1.x != p2.x){
						k = (p1.y-p2.y)/(p1.x-p2.x);
						b = p1.y-k*p1.x;
						
						p = new Point;
						p.x = p3.x;
						p.y = k*p.x+b;
						
					}
				}
				
				//如果两条线段没有相交,延长线相交则返回null
				if(p){
					if(p.x<Math.min(p1.x,p2.x)||p.x>Math.max(p1.x,p2.x)||p.x<Math.min(p3.x,p4.x)||p.x>Math.max(p3.x,p4.x)||
							p.y<Math.min(p1.y,p2.y)||p.y>Math.max(p1.y,p2.y)||p.y<Math.min(p3.y,p4.y)||p.y>Math.max(p3.y,p4.y)){
						return null;
					}
				}
				
				return p;
			}
			
			private function drawLine(event:MouseEvent):void{
				if(clickPoint.length>1){
					createLine(clickPoint[0],clickPoint[1]);
					if(pointArray.length == 0){
						line1.text = "("+clickPoint[0].x+","+clickPoint[0].y+"),"+"("+clickPoint[1].x+","+clickPoint[1].y+")";
					}else{
						line2.text = "("+clickPoint[0].x+","+clickPoint[0].y+"),"+"("+clickPoint[1].x+","+clickPoint[1].y+")";
					}
					pointArray = pointArray.concat(clickPoint);
					clickPoint = [];
				}
			}
			
			//根据两点,画线
			private function createLine(p1:Point, p2:Point):void{
				canvas.graphics.lineStyle(2,0xFF0000,1);
				canvas.graphics.moveTo(p1.x,p1.y);
				canvas.graphics.lineTo(p2.x,p2.y);
			}
			
			//清除线
			private function clearLine(event:MouseEvent):void{
				clickPoint = [];
				pointArray = [];
				startPoint.text = "";
				endPoint.text = "";
				line1.text = "";
				line2.text = "";
				crossPoint.text = "";
				canvas.graphics.clear();
			}
			
			private function getPoint(event:MouseEvent):void{
				if(pointArray.length == 4){
					var point:Point = getHitPoint(pointArray[0],pointArray[1],pointArray[2],pointArray[3]);
					if(point){
						crossPoint.text = "("+point.x+","+point.y+")";
					}else{
						crossPoint.text = "无交点";
					}
				}
			}
			
		]]>
	</mx:Script>
	<mx:Canvas height="30">
		<mx:Text text="起点:" x="0" width="40"/>
		<mx:TextInput id="startPoint" x="45" width="40" editable="false"/>
		<mx:Text text="终点:" x="85" width="40"/>
		<mx:TextInput id="endPoint" x="130" width="40" editable="false"/>
		<mx:Button id="btn" x="200" label="画线" click="drawLine(event)" width="60"/>
		<mx:Button id="clear" x="280" label="清除" click="clearLine(event)" width="60"/>
	</mx:Canvas>
	<mx:Canvas y="40" height="30">
		<mx:Text text="线1:" x="0" width="40"/>
		<mx:TextInput id="line1" x="45" width="120" editable="false"/>
		<mx:Text text="线2:" x="170" width="40"/>
		<mx:TextInput id="line2" x="215" width="120" editable="false"/>
		<mx:Button x="340" label="求交点" click="getPoint(event)" width="60"/>
		<mx:Text text="焦点:" x="405" width="40"/>
		<mx:TextInput id="crossPoint" x="450" width="80" editable="false"/>
	</mx:Canvas>
	<mx:Canvas y="80" id="canvas" width="200" height="200" click="click(event)" borderStyle="solid"/>
</mx:Application>

分享到:
评论

相关推荐

    找两条直线的交点.hdev

    HALCON源码画两个直线,找两条线的交点,

    C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)

    C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)

    判断两线段是否相交,相交求交点

    判断通过空间的坐标点确定的选段是否相交,相交的求出交点

    求两直线交点

    求两条直线交点,交点必须在两条线段上,首先计算两直线是否有交点,再判断交点是否在线段上。

    判断线段相交和求交点

    由于项目需要,写了两个函数,IsLineSegmentCross和GetCrossPoint,对于各种情况都能很好适应,并正确的求出交点。通过了各种测试,完美的实现个算法真不容易啊! 这个是连带一个MFC测试的程序工程VC6.0源码!

    c++计算三维空间中任意两条直线之间的位置关系(平行、相交、交错、重合)

    利用eigen库内矩阵运算函数,写了LinesPositionRelationship3D类。实现了确定三维空间任意两条直线位置关系并获得在平行和交错条件下的两直线距离的功能。该类是在确定空间两圆柱轴线关系下的副产品。

    计算几何常用算法:点、线、面

    15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求...

    ACM计算几何大全

    一、 注意事项 4 二、 一些公式 4 三、二维相关 6 基础: 6 点-点距离 7 点-点对称点 7 ...裸的n条线段判断是否有相交(O(nlogn)) 11 判断两直线平行 12 判断两直线垂直 12 给两点求直线方程参数 12

    geotools 判断点线是否相交 用的jar包

    geotools 判断几何要素的交点 当时想到用的GDAL 但是 交点函数返回的对象总是null , 改用 GeoTools 这个库,需要用到jar 到官网上下载,主要是jts-core-1.16.0.jar

    计算几何常用算法源码——线段与直线基本算法

    ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 ...15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7

    计算几何

    15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求...

    计算几何算法源码

    15.判断两条直线是否相交及求直线交点 16.判断线段是否相交,如果相交返回交点 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 2. 检查多边形顶点的凸凹性 3. 判断多边形是否凸多边形 4. 求多边形面积 5. 判断...

    ACM 计算几何模板

    7.14计算两条直线的交点 28 7.15计算直线与平面的交点 28 7.16计算两平面的交线 29 7.17点到直线的距离 29 7.18 计算点到平面的距离 29 7.19计算直线到直线的距离 30 7.20空间两直线夹角的cos值 30 7.21两平面夹角的...

    C++计算几何算法大全

    15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求...

    计算几何资料

    本文整理的计算几何基本概念和常用算法包括如下... 计算两条共线的线段的交点 25. 计算线段或直线与线段的交点 26. 求线段或直线与折线、矩形、多边形的交点 27. 求线段或直线与圆的交点 28. 凸包的概念 29. 凸包的求法

    计算几何算法大全

    15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求...

    计算几何资料计算几何资料

    计算两条共线的线段的交点 25. 计算线段或直线与线段的交点 26. 求线段或直线与折线、矩形、多边形的交点 27. 求线段或直线与圆的交点 28. 凸包的概念 29. 凸包的求法 ㈠ 点的基本运算 &lt;br&gt;1...

    空间几何计算

    15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求...

    计算几何算法实现[第一版]

    12.判断两条直线是否相交及求直线交点 13.判断线段是否相交,如果相交返回交点 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 2. 检查多边形顶点的凸凹性 3. 判断多边形是否凸多边形 4. 求多边形面积 5. 判断...

Global site tag (gtag.js) - Google Analytics