最近做的一个项目,经常画线,拖动对象。如:门(对象,有长和宽,引用一个门的图片,可旋转,指门从关闭到打开90度时的一段空间区域)必须在墙(对象,有粗细的直线)上,门可以在墙上移动等,经常要进行判断,和交点的计算。一些思路:
1.鼠标在门上按下时,记下门的坐标,鼠标在画布上的点击坐标,以及点击坐标与门的坐标的x,y差值。
2.鼠标移动时,门跟随鼠标移动,门的坐标为鼠标坐标与x,y差值之和。
3.鼠标按下时,首先进行如下判断:
1)门下面是否有墙,否则门回原位。(hitTestObject)
2)门的下面是否有几堵墙?若有多堵墙,选取一堵,选取规则自己定,最好优先选取门 移动前的那堵。
3)如果移动门没有换墙:
1))计算门与墙的交点。门应该是一边在墙上,而不是从中间就镶嵌在墙中。计算方法可以参考
计算两条线的交点,以及判断一个点是否在直线上,将两个对象看做两个线段)
2))改变门的坐标,使其在交点坐标上,这样就保证了门的一边是在墙上。
4)如果移动门到另外一堵墙上:
1))计算墙的角度。
2))改变门的角度与墙的角度一致。(因为角度的变化,门的对象的长宽都会发生变化)
3))同3)的1))
4))这步就和3)的2))有区别,因为角度的变化,原来对象发生变化,若按照3)的方法,在图像上,门可能不在墙上,出现偏差。根据门的角度重新计算门的图片与门的对象之间的关系。关系如下:(node代表门的对象,position代表门的图片在墙上显示的起始点即墙与门的交点,返回值Point,则是门对象的实际位置,如果是双开门,doorWidth = 2*doorHight):
private function setDoorPosition(node:Door, position:Point):Point{
var point:Point = new Point;
var angle:Number = node.angle;
var radius:Number;
if(angle<0){
radius = angle*Math.PI/180;
angle = angle + 360;
point.x = position.x;
point.y = position.y + doorWidth*Math.sin(radius);
node.location = point;
}else if(angle<90){
radius = angle*Math.PI/180;
point.x = position.x - doorHeight*Math.sin(radius);
point.y = position.y;
node.location = point;
}else if(angle<180){
radius = angle*Math.PI/180;
point.x = position.x-doorHeight*Math.sin(radius);
point.y = position.y+doorHeight*Math.cos(radius)-doorWidth*Math.sin(radius);
node.location = point;
}else if(angle<270){
radius = 0-(angle-180)*Math.PI/180;
point.x = position.x;
point.y = position.y + doorHeight*Math.cos(radius);
node.location = point;
}else if(angle<360){
radius = 0-(angle-180)*Math.PI/180;
point.x = position.x;
point.y = position.y + doorWidth*Math.sin(radius);
node.location = point; }
return point;
}
分享到:
相关推荐
### 求两直线相交的交点C++源代码解析 #### 一、知识点概述 本篇文章将详细解析一个用于求解两直线相交交点的C++源代码实现。该实现适用于任意两条直线(定义为起点和终点),如果这两条直线相交,则返回它们的...
"Unity3D判断两个物体相交脚本2"这个话题涉及到如何在引擎中高效地检测两个游戏对象(GameObject)是否发生重叠,即相交。在Unity3D中,我们通常使用Collider组件和Trigger事件来实现这一功能。 Collider是Unity3D...
两个多边形相交,意味着它们在二维平面上有共同的点。在几何学中,可以通过比较各个边来判断两个多边形是否相交。OpenLayers 3提供了`ol.geom.Polygon`类,用于创建和操作多边形对象。 1. **创建多边形**:在...
解这两个方程的系统,可以得到交点坐标(x, y)。 3. **使用Flex进行图形绘制**: - 在Flex中,我们可以使用`mx.graphics.graphicsClasses.Graphics`类来绘制图形。对于线条,我们可以使用`beginPath()`、`moveTo()`...
在ArcEngine中,利用IGeometryEngine的Intersect方法,可以找出两个图层中的重叠区域,这对于研究不同地理特征的重叠情况非常有用,如研究森林火灾与人口分布的交集。 3. **差集(Difference)**:差集分析则是找出...
对于给定的两个点\( A(x_1, y_1) \)和\( B(x_2, y_2) \),直线\( AB \)可以表示为: \[ y - y_1 = \frac{y_2 - y_1}{x_2 - x_1} (x - x_1) \] 如果给出另一条直线\( CD \),其中\( C(x_3, y_3) \)和\( D(x_4, y_4)...
在3D空间中,两个三角形可能有以下几种相交情况:完全不相交、完全重合、部分重叠或者相交于一个或多个点。这里的“相交”通常指的是两个三角形的边界或内部至少有一个点是共同的。在图形渲染、碰撞检测、物理模拟等...
disp) %排除重复的点复制代码经测试十几种奇怪的曲线相交(包括参数方程形式的曲线),目前发现上述代码的方法有四种情况会出现遗漏一两个交点。(其实上面代码本意是求显式函数的曲线交点,或者未知表达式的离散点...
5. **相交面积计算**:计算两个或多个多边形的相交部分,需要用到几何交集算法。MATLAB没有内建的函数直接处理这个问题,但可以通过自定义算法实现,例如使用扫描线算法或分治法。首先找出所有交点,然后根据交点...
计算数组中定义的 2 个圆之间的重叠区域 计算被矢量化,并以解析方式计算相交区域。 输入:圈出三列数组 G 中的数据。 G 包含 n 个圆的参数. G(1:n,1) - 圆心的 x 坐标, . G(1:n,2) - 圆心的 y 坐标, . G(1:n,3) -...
在C#中,NTS提供了一系列的几何操作方法,如`Intersects()`或`Overlaps()`,可以用来判断两个几何对象是否相交。 描述中提到的“不引用其它GIS工具”,意味着这个解决方案可能完全依赖于NTS或其他类似库,而不是...
描述中提到的“相交圆”是指两个或多个圆在某些点上重叠。在C#中,可以通过计算两个圆的中心点距离和各自的半径来判断是否相交。如果两圆的半径之和大于它们的中心点之间的距离,那么这两个圆是相交的。相交部分可以...
在MATLAB编程环境中,计算两个四边形的相交面积是一项常见的几何运算任务,尤其在图形处理、图像分析和物理模拟等领域。`quadintersect`函数是实现这一功能的关键工具,它能够有效地检测并计算出任意两个四边形的...
多边形的相交检测就是判断两个或多边形是否在二维平面上有重叠部分。 CocosCreator中,可以使用其内置的几何形状类来创建和操作多边形。例如,`cc.Polygon`类允许我们创建自定义的多边形。在实现相交检测时,通常会...
在判断两个时间段是否重叠时,我们可以使用以下逻辑:如果两个时间段的起始时间和终止时间不相交,那么它们就是不重叠的。如果两个时间段的起始时间和终止时间相交,那么它们就是重叠的。 下面是相关的代码实现: `...
通过这个方法,我们可以找到两个或多个几何对象的共同部分,从而确定它们的交点。 接下来是“两线之间的距离”查询,这是衡量地理空间关系的一种方式。在GIS中,我们不仅关心对象是否相交,还关注它们之间的空间...
- 碰撞检测是判断两个或多边形是否在空间中有重叠的过程,它是游戏开发中的核心算法之一,用于确定物体之间的交互。 - 碰撞检测分为简单碰撞(如球体与球体)和复杂碰撞(如多边形与多边形)。 3. **多边形相交...
7. **重叠区域计算**:如果两个多边形相交,还需要计算它们的重叠部分,这可能涉及到更复杂的几何分割算法。 8. **用户交互**:在VC++环境中,通过MapObjects库,用户可以直观地绘制和移动多边形,实现交互式操作。...
具体实现中,`TriangleAABB.cpp`和`TriangleAABB.h`两个文件可能包含了以下关键部分: 1. `Triangle`类:表示一个3D三角形,包含三个顶点坐标。 2. `AABB`类:表示轴对齐包围盒,包含最小和最大坐标点。 3. `...
它基于这样一个原理:如果两个多面体在所有可能的轴上都有非重叠的投影,那么它们不相交。 4. **光线投射(Ray Tracing)**: - **边界表示法(Boundary Representation, BRep)**:多面体的几何表示,包含面、边...