坐标数组转SVG多边形形状
我正在用Python制作一个随机地图生成器,主要是生成随机的政治区域。我有一个算法,可以生成一系列X,Y坐标,这些坐标代表不同的区域。这些区域不需要是相连的,所以这些点可以形成多个多边形的形状。
现在,我把这些点转换成一个路径字符串,实际上就是一条很长的线,绕来绕去形成一个形状。但这样做并不是Path的本来用途。而且效率也很低;如果某个区域特别大,这条线可能会变得几千个字符长。此外,使用这种方法后,线条的属性就像填充属性一样,这样我就无法在区域之间画出边界线了。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="512" height="512">
<path d="M 332 263 H 346 M 331 264 H 347 M 330 265 H 348 M 329 266 H 349 M 328 267 H 350 M 327 268 H 351 M 326 269 H 352 M 325 270 H 364 M 324 271 H 365 M 323 272 H 366 M 322 273 H 367 M 321 274 H 368 M 320 275 H 369 M 319 276 H 370 M 318 277 H 371 M 317 278 H 372 M 317 279 L 317 279 M 319 279 M 322 279 H 373 M 318 280 L 318 280 M 323 280 H 374 M 317 281 L 317 281 M 324 281 H 375 M 322 282 L 322 282 M 324 282 H 376 M 320 283 H 376 M 321 284 H 376 M 321 285 H 323 M 325 285 H 330 M 333 285 M 340 285 H 375 M 323 286 H 324 M 326 286 H 328 M 342 286 H 371 M 373 286 H 374 M 325 287 L 325 287 M 327 287 M 345 287 H 373 M 346 288 H 372 M 345 289 H 372 M 346 290 H 369 M 372 290 M 375 290 M 345 291 H 368 M 371 291 M 374 291 H 377 M 345 292 H 368 M 374 292 H 375 M 344 293 H 367 M 344 294 H 363 M 365 294 M 343 295 H 362 M 344 296 H 363 M 343 297 H 363 M 345 298 H 363 M 345 299 H 363 M 345 300 H 363 M 345 301 H 361 M 344 302 H 361 M 345 303 H 361 M 346 304 H 357 M 347 305 H 356 M 350 306 H 351 M 354 306 M 356 306" stroke="rgb(252, 81, 193)">
</path>
</svg>
真正的问题:
我该如何把一系列点转换成一个或多个多边形?更具体地说,我需要一个多边形的“线条”字符串。
2 个回答
1
1
显然,你的区域生成算法是基于位图的。你需要做的是描绘出形状的轮廓,而不是像现在这样通过“游程编码”来生成SVG。
具体怎么做有点复杂,不太适合在这里详细说明。一般来说,这个过程叫做“位图追踪”。有一个很流行的库叫做 potrace
,我记得它有Python的接口。
另外,你也可以利用你区域算法内部构建的数据结构,可能会做得比potrace更好。