`
琛哥哥
  • 浏览: 32331 次
  • 性别: 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++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)

    本主题主要关注在二维空间中处理几何问题的一些基本算法,如计算两点之间的距离、判断点是否在直线上、确定点与直线的关系、求解两直线的夹角和交点,以及计算两个矩形的重合面积。以下将详细阐述这些算法的实现原理...

    生成两直线的交点

    函数接收四个 `CSecPoint` 类型的参数,分别表示两条直线上的两个点,并返回一个指向交点的指针。下面对代码进行详细分析: 1. **初始化向量**: - `vector1` 表示由点 `spt1` 和 `spt2` 定义的直线方向向量; - ...

    两条直线相交判断方法

    在计算机图形学中,判断两条直线是否相交是一项基础但重要的任务。特别是在C#编程环境中,我们经常需要处理这样的问题,比如在游戏开发、几何计算或者数据可视化等场景。本篇将详细介绍如何在C#中判断两条直线是否...

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

    在计算机图形学、游戏开发以及地理信息系统等领域,判断两线段是否相交并求出交点是一个基础且重要的问题。本文将围绕“判断两线段是否相交,相交求交点”这一主题,深入探讨其算法原理及实现细节。 ### 一、问题...

    求两直线相交的交点C++源代码

    该实现适用于任意两条直线(定义为起点和终点),如果这两条直线相交,则返回它们的交点坐标;如果不相交,则返回`NULL`。本文将深入分析代码结构、算法原理,并探讨其实现细节。 #### 二、核心数据类型定义 在源...

    判断两直线是否相交 C++ MFC

    标题 "判断两直线是否相交 C++ MFC" 涉及的是计算机图形学和编程领域的一个基础问题,即在二维空间中如何使用C++和MFC(Microsoft Foundation Classes)来判断两条直线是否交叉。MFC是微软提供的一套C++类库,用于...

    判断两条直线相交算法

    判断两条直线是否相交是计算机图形学、计算几何以及数学建模中的一个重要问题。特别是在处理图形、地图数据或者进行路径规划时,该算法的应用尤为广泛。例如,在游戏开发中,用于检测碰撞;在地理信息系统中,用于...

    算法,求两直线交点

    在部分给出的Java代码示例中,`AlgorithmUtil`类提供了`GetIntersection`静态方法,用于计算由四个点定义的两条线段的交点,并判断这两条线段是否相交。方法中首先定义了一个`Point`类型的变量`intersection`用于...

    用matlab求曲线交点

    根据提供的文件信息,本文将详细解释如何在MATLAB中计算不同类型的曲线交点问题,包括两直线相交、直线与多条直线相交、直线与曲线相交、曲线与曲线相交以及直线与曲面相交的方法。 ### 1. 两直线相交 两直线相交...

    js几何坐标计算(点到线,面。点是否在线、面)

    **点是否在面上**的问题,如果面是二维平面上的一个多边形,可以利用射线与多边形交点的检测来判断;如果是三维空间中的平面,可以通过点的坐标是否满足平面的法向量和点的坐标构成的方程来判断。 **坐标转化**通常...

    C++编写判断直线是否在矩形内高效算法

    接下来,我们可以采用以下步骤来判断直线是否在矩形内: 1. **检查直线的两个端点:** - 如果直线的两个端点都在矩形内,那么直线肯定在矩形内。 - 如果两个端点都在矩形外,直线则不可能在矩形内。 - 如果一个...

    计算两条共线的线段的交点:

    标题提到的"计算两条共线的线段的交点",意味着我们要解决的是线段在同一直线上相交的情况。下面我们将详细探讨这个问题及其解决方案。 首先,我们需要了解线段的基本表示。在二维空间中,线段通常由两个端点A(x1, ...

    线段对象(判断是否相交以及相交点的获取)

    在JavaScript编程中,我们可以创建自定义的线段对象来处理线段相关的操作,如判断线段是否相交以及计算相交点。在百度地图API中,这样的功能可能用于定位路线交叉点或者进行地理数据处理。本文将详细讲解如何实现一...

    直线与直线,圆,矩形交点

    - **`getCross1`**:计算两条直线的交点。 - **`getCross2`**:计算直线与圆的交点。 #### 二、直线与直线交点的计算 1. **数学原理**: - 两直线的方程可以表示为`y = kx + b`,其中`k`为斜率,`b`为截距。 -...

    求两直线交点

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

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

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

    QGraphicsView画折线图Qt计算线段交点QGraphicsItem得简单使用

    对于两条直线(线段),我们可以先判断它们是否平行,如果不平行,那么可以使用两点式或点斜式方程来表示这两条线,然后解这两个方程组成的线性方程组,找到交点坐标。在Qt中,这可以通过`QPointF`的运算符重载来...

    判断线段相交和求交点

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

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

    - **定义**:计算两条线段之间的夹角。 - **算法原理**:先计算两线段的单位向量,再利用点乘结果计算夹角。 - **应用场景**:适用于机械设计中的角度计算。 9. **判断线段是否相交** - **定义**:检测两条...

Global site tag (gtag.js) - Google Analytics