2012-11-28 3 views
2

이론적으로 간단한 효과를 얻으려고합니다. 예를 들어, 창 주위에 두 개의 흰색 원이 튀어 오릅니다.교차하는 원 겹침

two intersecting disks, with intersection being black and everything else being white

이 할 수있는 방법이 있나요 : 교차 할 때, 나는 원의 나머지 부분은 다음과 같이 흰색을 유지하면서 검은 색으로 교차하는 원의 부품 싶어?

지금까지 나는이 있습니다

for(int i = 0; i < balls.length; i++) 
{ 
    balls[i].move(); 
    for(int j = 0; j < balls.length; j++) 
    { 
     if(i != j && balls[i].intersect(balls[j]) && !changed[i] && !changed[j]) 
     { 
      balls[j].swapColor(); 
      changed[j] = true; 
     } 
     else 
      changed[j] = false; 
    } 
    balls[i].display(); 
} 

을하지만 서로 교차 할 때 난 단지 교차로 자체를 변경하려는 반면 그것은 검은 색으로 동그라미 완전히을집니다.


편집 : 내가 더 잘 혼합 작업을보고 두하여 200x200 PNG 파일, magentared과 조화를()를 사용하여 시도했다. 그러나 blend() 매개 변수는 서클을 올바르게 배치하는 데 도움이되지 않습니다.

void setup() { 
    size(300, 300); 
    background(255); 
} 

void draw() { 
    PImage img = loadImage("circle.png"); 
    PImage img2 = loadImage("circle2.png"); 

    img.blend(img2,0,0,200,200,10,10,200,200,DIFFERENCE); 
    image(img,0,0); 
    image(img2,50,50); 
} 

이 날이 제공 :, 그 중심 사이의 거리가

+1

자바 또는 자바 스크립트? –

+1

Java 기반의 처리 –

+0

Java와 JavaScript는 완전히 다른 언어입니다. 나는 * 자바가 아니라 자바 스크립트에 대해 이야기하고 있다고 생각한다. – Pointy

답변

0

서로 교차하지만, 시각 효과의 경우 blend() 기능을 사용할 수 있습니다 (아마도 DIFFERENCE 모드에서).

createGraphicsbtw를 사용하여 타원을 PImage에 그릴 수 있습니다.

+0

예, 교차 논리가 있습니다. 해결했습니다. 원이 서로 충돌하는지 감지 할 수 있지만 겹치는 영역의 채우기를 변경하는 방법을 파악할 수는 없습니다. –

+0

오케이, 무엇을 사용하고 있습니까? 어떻게 그 서클에 그림을 그리는가? 몇 가지 코드 예제를 제공하거나 적어도 어떤 프레임 워크를 사용하고 있는지 알려줄 수 있습니까? 이미 거기에있을 수도 있습니다 – user902383

+0

나는 이것을 위해 [Processing] (http://www.processing.org)을 사용하고 있습니다.이 코드는 코드로 그리기위한 자바 변종입니다. 발췌 문장으로 OP를 편집했습니다. –

2

불행하게도 지금은 실행 가능한 샘플을 제공 할 수없는 자신의 반경의 합보다 작은 경우

two circles overlapping in Processing

+0

나는 그것을 줄 것이다. 감사! –

+0

나에게 적합하지 않았다. 내가 테스트 한 코드로 OP를 편집 할 것입니다 ... 두 개의 200x200 PNG 파일, 하나의 마젠타 색 원 및 하나의 빨간색 원을 만들었습니다. 차이 필터를 사용하여 새 원이 인스턴스화되고 필터가 제대로 작동하지만 각 위치를 활용하는 방법을 잘 모르겠습니다. 기본값은 0,0을 오버레이하는 것입니다. blend() 매개 변수에서 sx/sy/dx/dy 값을 변경해도 도움이되지 않았습니다. –

3

여기 한번 시도해보십시오. PImages 대신 두 개의 PGraphics를 사용하는 혼합 방식입니다. 간단한 예. 편집 : 기본 타원의 위쪽 모서리에 이상한 유물이 있습니다. 중복되면 타원형이됩니다. 왜 지금은 ... 왜 내가 찾으면, 여기에 게시 할 것입니다. EDIT2 : 당신이 부드러운 건너 뛰면 내가이 작업을 수행 할 수있는 재미있는 방법을 생각

PGraphics c; 
PGraphics d; 
void setup() { 
    size(300, 300); 
    background(255); 
    c = createGraphics(width, height, JAVA2D); 
    d = createGraphics(width, height, JAVA2D); 
    c.beginDraw(); 
    c.smooth(); 
    c.endDraw(); 
    d.beginDraw(); 
    d.smooth(); 
    d.endDraw(); 
} 

void draw() { 
    background(255); 
    c.beginDraw(); 
    c.background(0, 0); 
    c.fill(255); 
    c.stroke(0); 
    c.ellipse(mouseX, mouseY, 30, 30); 
    c.endDraw(); 

    d.beginDraw(); 
    d.background(0, 0); 
    d.fill(255); 
    d.stroke(0); 
    d.ellipse(width/2, height/2, 30, 30); 
    d.endDraw(); 
    d.blend(c, 0, 0, width, height, 0, 0, width, height, DIFFERENCE); 
    image(d, 0, 0); 
} 
+0

이것은 매우 효과적입니다! – Pwdr

1

() 이슈가 사라의 앤티 앨리어싱과 관련이있을 것으로 보인다. 다음 코드로 새 스케치를 만들고 캔버스 내에서 마우스를 움직입니다.

void setup() { 
    size(600,600); 
} 

void draw() { 
    background(0); 

    int c1x = width/2; 
    int c1y = height/2; 
    int c2x = mouseX; 
    int c2y = mouseY; 

    int d = 100; 

    boolean intersect = false; 
    if(dist(c1x, c1y, c2x, c2y) < d) intersect = true; 

    fill(255); 
    stroke(0); 
    ellipse(c1x, c1y, d, d); 
    ellipse(c2x, c2y, d, d); 
    noFill(); 
    ellipse(c1x, c1y, d, d); 

    stroke(0, 0, 255); 
    line(c1x, c1y, c2x, c2y); 

    stroke(255, 0, 0); 
    if(intersect) stroke(0, 255, 0); 
    rectMode(CORNERS); 
    int mx = (c1x+c2x)/2; 
    int my = (c1y+c2y)/2; 
    int r = d/2; 
    rect(mx-r, my-r, mx+r, my+r); 

    if(intersect) { 
    for(int j = my-r; j <= my+r; j++) { 
     for(int i = mx-r; i <= mx+r; i++) { 
     if(dist(i, j, c1x, c1y) <= r && dist(i, j, c2x, c2y) <= r) { 
      stroke(0); 
      point(i, j); 
     } 
     } 
    } 
    } 
} 

이것은 개념을 보여주는 더러운 모형입니다. 나는 두 동그라미의 중심점을 안다. 저는 원의 직경과 같은 너비와 높이를 가진 정사각형을 상상해 봅니다. 그리고 저는 그 원을 두 원 사이의 중간 점에 놓습니다. 원이 충돌하면 사각형 내의 각 픽셀을 확인하고 픽셀이 두 원 안에 있으면 점을 그립니다.

동일한 지름의 원을 사용하여 간단하게 만들었지 만 다양한 지름으로 수정하는 것은 간단합니다.

Screenshot of circle intersection fill

분명히 당신이 녹색 사각형과 파란색 선을 그릴 필요가 없습니다, 사람들은 단지 참고 용있다.

+0

놀라운! 나는 어쨌든 순수한 수학 솔루션을 좋아한다. 공유해 주셔서 감사합니다. –

0

흰색 교차점과 배경이있는 어두운 타원이며 빠르고 더럽지 만 작동합니다. 흰색 배경

이 같은

background(255); 

호출 뭔가 :

blendMode(SUBTRACT); 
    fill(0); 
    ball1.display(); 
    fill(255); 
    ball2.display(); 

당신이 this link을 확인 뒤에 수학에서 살펴 봐야 할 경우

. toxiclibs.geom과 같은 라이브러리를 사용하여이 작업을 수행 할 수도 있습니다.