gpt4 book ai didi

geometry - 创建任意的曲线众所周知的文本行字符串以在 OpenLayers 中显示

转载 作者:行者123 更新时间:2023-12-04 06:48:34 24 4
gpt4 key购买 nike

我正在生成的 map 图层中的点之间动态生成 W​​KT LineString 以在 OpenLayers 中显示。我想让点之间的线弯曲,并且我希望能够根据各种输入变量动态改变曲率。

这是针对网络监控应用程序的,我们希望曲率基于点之间的延迟时间(不是原始延迟本身,而是在给定时间段内与“正常”值的偏差)。

虽然一些 GIS 应用程序和数据库支持 CircularString WKT 的扩展,OpenLayers 对此一无所知。

所以我需要用线段生成一条曲线:

现在,行字符串很简单:

LINESTRING(hop1_long hop1_lat, hop2_long hop2_lat)

我可以确定使线段“弯曲”的唯一方法是插入中间点:

LINESTRING(hop1_long hop1_lat, long1 lat1, long2 lat2, ..., hop2_long hop2_lat)

这对于我们的应用程序来说应该是完全足够的,但我不知道如何生成中间点!

我假设有众所周知的方法/算法可以从二维平面中的线段中生成“曲线”线。有没有人对如何实现这一点有任何想法,或者有帮助的书籍/文章/在线资源?

更新 (2010-08-13):

Bezier 曲线就是票,在阅读它之后,实现基本的 Bezier 算法非常容易。但是我必须编写一些代码来生成控制点。这是我想出的 PHP 代码。这假设了一个带有 x 的“Vector2d”类和 y成员。

函数 get_control_points($to, $from, $mag_scale, $angle) {
$dirX = $to->x - $from->x;
$dirY = $to->y - $from->y;

$mag = sqrt(($dirX * $dirX) + ($dirY * $dirY));
如果(!$mag){
返回数组($to, $from);
}

$length = $mag * $mag_scale;

$dirX = $dirX/$mag;
$dirY = $dirY/$mag;

$sin = sin($angle);
$cos = cos($angle);

$rotX = $cos * $dirX - $sin * $dirY;
$rotY = $sin * $dirX + $cos * $dirY;
$rotNegX = $cos * -$dirX - $sin * $dirY;
$rotNegY = $sin * $dirX - $cos * $dirY;

//翻转“向后”曲线的控制点
如果 ($dirX x;
$y1 = -$rotNegY * $length + $from->y;
$x2 = -$rotX * $length + $to->x;
$y2 = -$rotY * $length + $to->y;
}
//或生成“正常”控制点
别的 {
$x1 = $rotX * $length + $from->x;
$y1 = $rotY * $length + $from->y;
$x2 = $rotNegX * $length + $to->x;
$y2 = $rotNegY * $length + $to->y;
}

返回数组(new Vector2d($x2, $y2), new Vector2d($x1, $y1));
}

最佳答案

如果您想生成一系列构成曲线的线段,请首先查看易于通过单个变量参数化的曲线。例如,以 (cx,cy) 为中心、半径为 r 的圆由以下表达式参数化:

(x,y) = (cx,cy)+r*(cos(t), sin(t)),

其中 t 从 0 到 2π。

因此,您可以创建一个半圆形,例如,在值 tk=π×k/30 处评估圆,其中 k 从 0 到 30。这将为您提供由 30 条线段组成的半圆弧。

如果您想要更一般的曲线,请查看 Bezier curves .它们由一个值 t 参数化,该值可以在 0 和 1 之间的均匀间隔内进行评估。

关于geometry - 创建任意的曲线众所周知的文本行字符串以在 OpenLayers 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3443339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com