2012-09-13 23 views
0

我在photoshop中创建了一些地图(8000x8000)。地图的每个部分都使用自定义形状工具创建,并可导出到* .ai文件。所以我出口一例形状* .AI文件,它具有以下内容:如何决定/检查某个点是否属于矢量形状?

%!PS-Adobe-2.0 
%%Creator: Adobe Photoshop(TM) Pen Path Export 7.0 
%%Title: (map-small-paddington.ai) 
%%DocumentNeededResources: procset Adobe_packedarray 2.0 0 
%%+ procset Adobe_IllustratorA_AI3 1.0 1 
%%ColorUsage: Black&White 
%%BoundingBox: 0 0 7998 7998 
%%HiResBoundingBox: 0 0 7998.9998 7998.9998 
%AI3_Cropmarks: 0 0 7998.9998 7998.9998 
%%DocumentPreview: None 
%%EndComments 
%%BeginProlog 
%%IncludeResource: procset Adobe_packedarray 2.0 0 
Adobe_packedarray /initialize get exec 
%%IncludeResource: procset Adobe_IllustratorA_AI3 1.0 1 
%%EndProlog 
%%BeginSetup 
Adobe_IllustratorA_AI3 /initialize get exec 
n 
%%EndSetup 
0.0 0.0 0.0 1.0 k 
0 i 0 J 0 j 1 w 4 M []0 d 
%%Note: 
%Adobe_Photoshop_Path_Begin:<< /defaultFill false >> 
*u 
%AI3_Note:<< /operation /union >> 
0 XR 
4771.1153 4121.9960 m 
4855.5878 4111.9732 4957.9582 4086.2029 5003.7736 4060.4311 c 
5049.5891 4034.6599 5120.0382 3972.7994 5193.7738 3957.0505 c 
5267.5089 3941.3016 5323.5226 3946.6539 5355.9339 3949.0778 C 
5356.7559 3955.9301 5358.4651 3964.2284 5361.9409 3972.1987 C 
5361.4717 3972.3317 L 
5358.0990 3975.3640 5353.5658 3979.5329 5347.8721 3984.9663 c 
5333.9035 3998.3003 5250.7315 4090.9969 Y 
5162.4795 4165.2807 5134.5423 4193.2165 v 
5106.6045 4221.1528 5064.0674 4221.7889 5022.1634 4227.5026 c 
4980.2590 4233.2172 4968.8311 4237.6617 4932.0072 4254.1706 c 
4895.1828 4270.6786 4843.1201 4292.2642 4827.8818 4298.6139 c 
4812.6435 4304.9637 4796.1361 4316.3911 4778.9935 4340.5184 c 
4761.8505 4364.6433 4745.9776 4385.5963 4728.8351 4398.9284 c 
4723.2744 4403.2528 4716.9076 4407.1833 4712.3291 4410.3572 C 
4681.6484 4314.8482 4661.9599 4219.4050 V 
4662.8157 4217.2633 4684.8314 4162.2146 4701.6759 4132.7359 C 
4710.9826 4122.7135 4771.1153 4121.9960 Y 
n 
*U 
%Adobe_Photoshop_Path_End 
%%Trailer 
%%EOF 

现在,让我们说,我有两点:(4830,3780)属于这种形状,和(4480,3130),这没有。我知道这是因为我在Photoshop中检查过它。

但我的问题是如何检查我想编程的每一点?有没有办法在PHP中做到这一点?

所以问题由两个部分组成:

  1. 加载和读取*。爱文件
  2. 检查点是否属于形状。

任何帮助,将不胜感激。

+0

形状交叉点怎么样?有没有礼物? – Havelock

+0

它可能发生,但是然后点可以属于第一或第二区域 - 我不在乎。所以如果我在一个地区找到这一点,我不会在另一个地方寻找它。 – Karol

回答

1

我能想到的检查内部/外部的最简单方法是栅格化图像并使用颜色。

创建地图的一个版本,其中形状元素全部为黑色,背景为白色。将其保存为JPEG。如果你已经安装了GD或Imagemagik PHP扩展,PHP可以在坐标挑颜色从图像中你想要的:

<?php 
$im = imagecreatefromjpeg('map.jpg'); // Import black/white map image 
var_dump(isInside($im, 4830, 3780)); // bool(true) 
var_dump(isInside($im, 4480, 3130)); // bool(false) 

function isInside($im, $x, $y) { 
    $rgb = imagecolorat($im, $x, $y); 
    $colors = imagecolorsforindex($im, $rgb); 
    $value = ($colors['red'] + $colors['green'] + $colors['blue'])/3; // Get average value 
    return ($value <= 10)? true : false; // If average value is less than 10, this pixel is black (or very close to it), so is inside a shape 
} 
?> 

我使用的是$value <= 10而不是在这里$value == 0,因为在其边缘处的形状,你会得到一个小的别名,白色背景将混合成黑色的形状。颜色值从0到255,因此10/255仍然非常黑,并且将确保如果您的目标是靠近形状边界的像素,它仍然会正确评估。

+0

这就是我从未想过的方式......谢谢 - 我会尽力解决您的问题并写下一些想法。 – Karol

+0

也许我会将这个文件导出到PNG(透明背景上的黑色形状),所以不会出现抗锯齿问题。 – Karol

+0

@Carlos“透明”与“白色”作为背景没有区别;在形状的边缘附近会有一些像素不是完全的“形状”颜色,也不是完全的“背景”颜色,因此您必须决定将其切除的阈值。 – MidnightLightning

相关问题