2014-07-27 201 views
1

我在Python中制作一个随机图生成器。我正在产生随机的政治领土。我有一个算法可以为一系列区域生成X,Y坐标列表。这些地区不需要是连续的,所以点的列表可以产生多个多边形形状。SVG坐标数组多边形形状

目前,我将点列表转换为路径字符串,本质上是一条非常长的线条,用于形成一个形状。并不完全是Path的意图。这也是非常低效的;如果你有一个特别长的领土,它可以达到几千字。此外,使用此方法使笔画属性基本上像填充属性一样,这意味着我无法在区域之间绘制边框线。

Here's an example of what I'm doing now

<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> 

实际的问题:
我怎么能点的列表转换为一个或多个多边形?更具体地说,我需要一个多边形“线”字符串。

回答

1

显然你的领土生成算法是基于位图的。你需要的是追踪形状的轮廓,而不是像现在这样通过“行程编码”形状来制作SVG。

描述如何做到这一点有点超越S.O.回答。在一般意义上,这被称为“位图追踪”。一个流行的图书馆是potrace。我认为它有Python绑定。

否则,您可以利用您的领土算法构建的内部数据结构来做更好的工作(而不是potrace)。

1

这里是你的SVG形状目前的样子:

enter image description here

而非确切的轮廓的解决方案,我建议你可以在较低的分辨率生成地图,然后用一个marching squares算法转换到高分辨率矢量格式。