私はblobDetection ライブラリを使用して高さマップから等高線マップを作成する処理に取り組んでいます。私の最終的な目標は、ブロブをレーザーカットして、一種の建築景観の模型を作ることです.
現在、輪郭を取得して輪郭マップを SVG としてエクスポートできますが、これは素晴らしいことですが、各ブロブ (または輪郭、またはリング) を識別し、各輪郭を個別に操作できるようにしたいと考えています。つまり、ウィンドウ上でそれらを再配置して、それらが互いに重ならないようにし、重ならないようにしたいと考えています。また、個々のブロブに座標を割り当てて、レーザー カット後に各ブロブがどこに移動するかを簡単に把握できるようにします。
コードは次のとおりです (作成者 v3ga によって提供された例から):
import processing.svg.*;
import blobDetection.*;
import peasy.*;
import processing.pdf.*;
PeasyCam cam;
PImage img;
float levels = 10;
float factor = 10;
float elevation = 125;
float colorStart = 0;
float colorRange = 160;
BlobDetection[] contours = new BlobDetection[int(levels)];
boolean recording = false;
void keyPressed(){
if (key == 'r' || key == 'R'){
recording = !recording;
}
}
void setup() {
size(1000,800,P3D);
surface.setResizable(true);
img = loadImage("map1.gif");
surface.setSize(img.width, img.height);
cam = new PeasyCam(this, img.width, img.height, 0, 500);
colorMode(HSB, 360, 100, 100);
for (int i=0; i<levels; i++){
contours[i] = new BlobDetection(img.width, img.height);
contours[i].setThreshold(i/levels);
contours[i].computeBlobs(img.pixels);
}
}
void draw(){
if (recording){
beginRecord(SVG, "frame_####.svg");
}
for (int i=0; i<levels; i++){
drawContours(i);
}
if (recording) {
endRecord();
recording = false;
}
}
void drawContours(int i) {
Blob b;
EdgeVertex eA,eB;
for (int n=0 ; n<contours[i].getBlobNb() ; n++) {
b=contours[i].getBlob(n);
if (b!=null) {
stroke(250,75,90);
for (int m=0;m<b.getEdgeNb();m++) {
eA = b.getEdgeVertexA(m);
eB = b.getEdgeVertexB(m);
if (eA !=null && eB !=null)
line(
eA.x*img.width, eA.y*img.height,
eB.x*img.width, eB.y*img.height
);
}
}
}
}
いくつかのことをテストした後、各ブロブ (x 座標と y 座標、レベル) の情報を含むオブジェクトの配列を作成し、drawContours メソッドでこの配列を埋めるのが最善だと思います。ただし、この配列に格納する正しい情報を取得するのに苦労しています。
だから私の質問は:
- これらのブロブなどの複雑な形状の x、y 座標を特定する方法
- 配列に情報ストアを作成したら、ブロブの位置を変更する方法
他の手法 (つまり、処理ではない) を使用する場合でも、任意の提案をいただければ幸いです。