2011-10-19 6 views
2

일부 선을 그리려는 중입니다. 문제는 색상에 관한 것입니다. 예를 들어. 나는 여러 줄의 붉은 색을 가지고 있고 푸른 색의 한 줄을 그린다. 그리고 때로는 그것들이 더 많은 선은 그 마지막 선을 위해 불투명합니다.Java - 불투명 한 색상

알파 합성물 0.7로 새로운 색상과 색을 설정하려고했습니다. 더 많은 선들에 대해, 그리고 하나의 색상은 기본값을 남겼습니다 - 불투명 (알파 1.0). 처음에는 더 많은 선을 그리고 마지막 선을 그립니다. 그러나 그 행은 그 것을 "덮어 씁니다". 이 문제를 해결할 수있는 해결책이 있습니까?

그 선을 유리판에 그립니다.


편집 : 그 코드가 강력한, 그래서 그것을 게시하기 어렵고,이 논문의 한 부분이다. 원칙은 예를 들어 2 색입니다 색상 기본 색상; 색상 유사 색상;

나는 paint 메소드와 2 개의 해시 맵을 속성으로 가지고 있는데, 몇몇 포인트가 저장됩니다. 나는이지도를 반복하고 그 점과 그와 비슷한 점을 기억하고 다른 모든 것은 graphics2D.drawLine (x1, y1, x2, y2)로 연결하고 색상을 변경하고 마지막 한 라인을 다른 색상으로 페인트합니다. 나는 뇌졸중을 너무 중요하게 바꾸고있다. 나는 그것이 충분 바랍니다

...


EDIT2 : 여기 내가 어떤 강력한 페인트 방법보다 몇 가지 포인트 similarPoint이 및 그래픽 포인트의 목록을 통해 반복자의 반복 처리를 수정하는 것입니다 ' 기울기.

Point similar = null; 
Iterator<Point> secondIterator; 
graphics.setColor(colorOfSimilar); 
while (iterator.hasNext()) { 
    Point point = iterator.next(); 
    if (point.equals(similarPoint)) { 
     similar = similarPoint; 
    } else { 
     secondIterator = secondMap.get(point).iterator(); 
     while (secondIterator.hasNext()) { 
      Point secondPoint = secondIterator.next(); 
      graphics2D.drawLine(point.getX(), point.getY(), 
       secondPoint.getX(), secondPoint.getY()); 
     } 
    } 
} 
if (similar != null) { 
    secondIterator = secondMap.get(similar); 
    graphics2D.setColor(hooverColor); 
    graphics2D.setStroke(new BasicStroke(2.5f)); 
    while (secondIterator.hasNext()) { 
     Point secondPoint = secondIterator.next(); 
     graphics2D.drawLine(similar.getX(), similar.getY(), 
      secondPoint.getX(), secondPoint.getY()); 
    } 
    graphics2D.setColor(colorOfSimilar); 
    graphics2D.setStroke(new BasicStroke(1.0f)); 
} 

내가 어떤 실수에 대해 죄송 메모장에 쓴 (내가 괄호 등을 생각)하지만, 그 반복 처리 및 기타 다른 방법이지만, 그것은 중요하지 않습니다 주변이, 수정의 메커니즘이다. 뇌졸중에 대한 문제는 존재하지 않습니다. 왜냐하면 처음에는 뇌졸중이 없었기 때문입니다.

아무쪼록 감사드립니다.

+0

코드 샘플? 아무것도? – Neal

+4

[sscce] (http://www.sscce.org/)를 게시 할 수 있습니까? –

+1

편집에 대한 응답으로 SSCCE만이 문제를 시사합니다. 이 코드는 원래 코드의 매우 실망스러운 버전 일 수도 있고, 데모 목적으로 특별히 작성된 코드 일 수도 있습니다. SSCCE를 작성하면 뇌졸중이 문제의 일부인지 알 수 있습니다. –

답변

7

결과는 setComposite()을 사용하여 그래픽 컨텍스트에 지정된 합성 규칙에 따라 다릅니다. 이 utility은 다양한 모드를 이해하는 데 유용 할 수 있습니다. 또한 설명하는 문제가있는 sscce을 준비하는 데 도움이 될 수 있습니다.

부록 : 여기에 AlphaComposite.Src 모드를 사용하는 방법을 보여주는 예가 있습니다.

enter image description here

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.*; 

/** @see http://stackoverflow.com/questions/7823631 */ 
public class X extends JPanel { 

    private static final int SIZE = 300; 
    private static final int INSET = 64; 
    private static final AlphaComposite OVER_HALF = 
     AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); 
    private boolean src; 

    public X(boolean src) { 
     this.src = src; 
     this.setBackground(Color.lightGray); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(SIZE, SIZE); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     Line2D line1 = new Line2D.Double(INSET, INSET, 
      getWidth() - INSET, getHeight() - INSET); 
     Line2D line2 = new Line2D.Double(getWidth() - INSET, 
      INSET, INSET, getHeight() - INSET); 
     g2.setStroke(new BasicStroke(64, 
      BasicStroke.CAP_ROUND, 
      BasicStroke.JOIN_BEVEL)); 
     g2.setComposite(OVER_HALF); 
     g2.setColor(Color.red); 
     g2.draw(line1); 
     if (src) { 
      g2.setComposite(AlphaComposite.Src); 
     } 
     g2.setColor(Color.blue); 
     g2.draw(line2); 
    } 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new GridLayout(1, 0)); 
     frame.add(new X(false)); 
     frame.add(new X(true)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

나는 composite를 통해 src를 사용하기 위해 composite를 설정하려고 시도하고 common line 색을 0.5 alpha로, 다른 line 1.0 alpha로 만든다. 그러나 나는 약간의 아이디어를 얻는다. 어쩌면 공통 행을 목적지로 사용하고 마지막 하나는 src를 통해 .... 나는 그것을 시도 할 것이다. – Equo

+0

약간의 준비를 해주셔서 고맙게 생각합니다. 메소드는 paintLines (Graphics2D 그래픽)입니다.이 메소드는 다른 메소드로 오버라이드 된 메톤 페인트 (Graphics g)로 불려갑니다. 나는 최적화를 위해 약간의 코드를 변경한다. (지도는 많은 객체를 가지고 계산하고 조작하는 데 오랜 시간이 걸린다.) paintLines 메소드에서는 몇 줄을 먼저 그려 넣고 몇 가지 규칙을 사용하여 합성을 변경하고 마지막 하나를 그려 넣는다. 그래픽을 2 그래픽 (srcGraphics, dstGraphics)으로 복사하기 위해 graphics.createGraphics()를 사용하려고 시도했지만 수정 한 것보다 훨씬 효과적이었습니다. 문제를 이해하기 위해 간단한 질문을하십시오. – Equo

+0

문제를 설명하는 _your_ [sscce] (http://sscce.org/)를 포함하도록 질문을 편집해야합니다. 예제의 초점을 좁히는 방법에 대한 링크를 읽으십시오. – trashgod

관련 문제