求两线段交点

这是一个计算两线段交点的C++程序,基于参数化线段和二元一次方程组求解。通过给定的四个点表示线段,程序能够判断线段是否相交并返回交点坐标。代码可移植到OpenGL进行图形化展示。

求两线段交点

                                                                         

                                                               求两线段交点

 

事实上,你很快就可以看到这个程序很容易移植到OpenGL,并且使用图形方式显示出来;

相当cool。

<think> 我们正在讨论等高线图截取横纵断面的方法。等高线图是地理信息系统中常用的表示地形高程的方式,截取横纵断面是指沿着某一水平方向(横断面)或垂直方向(纵断面)切割地形,得到高程变化的剖面图。 步骤: 1. 确定断面位置:在等高线图上画一条直线,表示你想要截取的横断面或纵断面。横断面通常垂直于主要山脊线或沟谷,纵断面则平行于主要走向。 2. 获取交点坐标:该直线会与多条等高线相交,记录每个交点的位置(平面坐标x,y)以及该点的高程值(z)。 3. 绘制断面图:以水平距离为横轴,高程为纵轴,将每个交点按顺序连接起来,形成断面线。 具体方法: 假设我们有一张等高线图,其等高线已经数字化(即每条等高线由一系列点组成,并带有高程属性)。要截取沿直线AB的断面。 数学原理: 设直线AB的参数方程为: $$ x = x_0 + t \cdot \Delta x $$ $$ y = y_0 + t \cdot \Delta y $$ 其中$t$为参数,$(x_0,y_0)$为起点A的坐标,$(\Delta x, \Delta y)$为方向向量(B-A)。 对于每条等高线(由点列组成),我们计算直线AB与等高线线段交点。这可以通过线段与直线的交点来实现。 交点计算: 设等高线上相邻两点为$P_1(x_1,y_1), P_2(x_2,y_2)$,直线AB的参数方程如上。则线段$P_1P_2$的参数方程为: $$ x = x_1 + s \cdot (x_2-x_1) $$ $$ y = y_1 + s \cdot (y_2-y_1) $$ 其中$s \in [0,1]$。 联立直线AB和线段$P_1P_2$的方程,得到: $$ x_0 + t \cdot \Delta x = x_1 + s \cdot (x_2-x_1) $$ $$ y_0 + t \cdot \Delta y = y_1 + s \cdot (y_2-y_1) $$ 这是一个关于$s$和$t$的二元一次方程组,可解。若$s$在[0,1]范围内且$t$在[0,1]范围内(这里t在[0,1]表示交点在AB线段内),则交点有效。 然后,计算该交点处的平面坐标,进而计算该点在AB上的位置(从A点开始的距离): $$ d = t \cdot \sqrt{\Delta x^2 + \Delta y^2} $$ 该点的高程值取等高线的高程(因为等高线上点的高程相同)。 最后,我们得到一系列点$(d, z)$,按d排序后连接成线,即得断面图。 工具实现: 在GIS软件中(如ArcGIS,QGIS)通常有现成的工具可以提取断面。例如在QGIS中,可以使用“剖面图”插件(Profile Tool)来提取。 代码示例(Python): 假设我们有一组等高线(每条等高线是一个点列表,每个点有x,y,z,其中z为常数),以及断面线段AB(A(xa,ya), B(xb,yb))。 伪代码: 1. 计算AB向量的分量:dx = xb - xa, dy = yb - ya 2. 总长度:L = sqrt(dx*dx+dy*dy) 3. 初始化交点列表:intersections = [] 4. 遍历每条等高线: 遍历该等高线上相邻点组成的线段(P1, P2): 解方程组s,t(注意方程组可能无解或平行) 如果s在[0,1]且t在[0,1]: 计算该交点在AB上的距离:d = t * L 交点的高程z = 当前等高线的高程 将(d,z)加入intersections 5. 按d对intersections排序 6. 绘制d为横轴,z为纵轴的折线图 注意:实际中,等高线可能是折线(由多个线段组成),所以需要遍历每条等高线的所有线段。 此外,如果断面线AB很长,可能需要考虑效率问题。 另一种方法:如果等高线数据是规则网格(DEM),则可以直接通过插值得到沿AB的高程值。但这里讨论的是基于等高线(矢量数据)的方法。 引用: 在GIS中,从等高线提取断面是地形分析的基本功能之一[^1]。 §§相关问题§§ 1. 如何根据数字高程模型(DEM)提取断面? 2. 在等高线图中,如何自动识别山脊线和山谷线? 3. 除了断面图,等高线图还有哪些地形分析方法? </think>### 等高线图截取横纵断面的方法 在等高线图中截取横纵断面是地形分析的基础操作,用于获取特定方向的地形高程变化剖面。以下是详细步骤: #### **1. 确定断面位置** - **横断面**:垂直于山脊线或主要走向切割(如东西方向) - **纵断面**:平行于山脊线或主要走向切割(如南北方向) - **操作**:在等高线图上绘制一条直线表示断面位置,起点和终点需覆盖目标区域 #### **2. 提取高程数据** **方法一:手工提取(纸质地图)** 1. 标记等高线与断面线的交点 2. 记录各交点的高程值(z)和距起点的水平距离(d) 3. 建立数据表: | 点序 | 距离d(m) | 高程z(m) | |------|----------|----------| | 1 | 0 | 105 | | 2 | 50 | 120 | **方法二:GIS软件提取(推荐)** ```python # QGIS示例代码(PyQGIS) profile_line = QgsGeometry.fromPolyline([QgsPoint(起点坐标), QgsPoint(终点坐标)]) elevation_points = [] for contour in contour_layer.getFeatures(): intersection = contour.geometry().intersection(profile_line) if intersection: point = intersection.asPoint() dist = profile_line.lineLocatePoint(point) # 计算距起点距离 elevation_points.append((dist, contour["elevation"])) ``` #### **3. 绘制断面图** 使用提取的数据生成二维剖面图: - **横轴**:水平距离(d) - **纵轴**:高程(z) - **示例图**: ``` 高程 (m) 200| /\ | / \ 150|-----/----\---- | / \ 100|__/__________\_ 0 100 200 300 → 距离(m) ``` #### **4. 关键技巧** 1. **密度控制**:断面线需穿过足够多的等高线(建议≥5条),避免信息丢失 2. **高程插值**:当交点稀疏时,用线性插值补充数据: $$ z = z_1 + \frac{(d - d_1)(z_2 - z_1)}{d_2 - d_1} $$ 3. **精度验证**:对比相邻断面,确保地形突变区(如陡崖)被准确捕捉 #### **工具推荐** - **GIS软件**:QGIS(剖面工具插件)、ArcGIS(3D Analyst) - **在线工具**:Google Earth高程剖面 - **编程实现**: ```python # Python示例(使用matplotlib) import matplotlib.pyplot as plt distances = [0, 50, 100, 150] # 水平距离 elevations = [105, 120, 135, 110] # 高程 plt.plot(distances, elevations, 'r-') plt.xlabel("水平距离 (m)") plt.ylabel("高程 (m)") plt.title("地形横断面图") plt.grid(True) plt.show() ``` > **注意**:断面精度取决于等高线密度,在1:5万地形图上,等高距每增加10米可能导致断面误差±2-5米[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值