2014-06-24 2 views
0

사용자가 사용자 정의 배경 이미지와 크기를 사용할 수있는 게이지를 만들려고했는데 모든 것이 작동합니다. 그러나 일부 모양에서는 바늘/포인터가 잘못 정렬됩니다.주어진 시작점과 각도로 선을 그리는 자바 프로그램

좀 더 구체적으로 말하자면 (포인터 시작점은 사용자가 지정할 수 있음) 다이얼 게이지에서 바늘/포인터의 시작점을 알고 있습니다. 이제 문제는 사용자가 게이지가 나타내는 최대/최소 각도와 최대/최소값을 선택할 수 있다는 것입니다. 아무도 내가 정확한 최종 점을 얻을 수 있도록 각도를 설정할 수있는 방법을 제안 할 수 있습니까? 여기에 내가 참고로 지금까지

int x1 = centerX, x2 = x1, y1 = centerY, y2 = y1; 

    double angle = min_angle + (1.0 * (max_angle - min_angle)/(1.0 * (max_val - min_val))) * (value - min_val) ; 

    if(max_angle > min_angle ) 
    angle = max_angle - angle; 
    else 
    angle = min_angle - angle; 

    x2 += (int)(Math.cos(Math.toRadians(angle))*ind_len); 
    y2 -= (int)(Math.sin(Math.toRadians(angle))*ind_len); 

을하고있는 무슨이다 :이

답변

0

뭘했던 것은 완전히 잘못이 아니었다 자바에서 이루어집니다,하지만 난 실제 질문을 보지도 않았고 나는 읽었다 오류를 찾기에 충분히 근접한 코드. 대신, 여기에 간단한 게이지 구현이 있습니다.

Gauge Image

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.RenderingHints; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Line2D; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class GaugeTest 
{ 
    public static void main(String[] args) throws IOException 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.getContentPane().setLayout(new BorderLayout()); 

     GaugePanel gaugePanel = new GaugePanel(); 
     f.getContentPane().add(gaugePanel, BorderLayout.CENTER); 

     JPanel controlPanel = createControlPanel(gaugePanel); 
     f.getContentPane().add(controlPanel, BorderLayout.NORTH); 

     f.setSize(600,800); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    static JPanel createControlPanel(final GaugePanel gaugePanel) 
    { 
     final JSlider minAngleSlider = new JSlider(0, 100, 0); 
     final JSlider maxAngleSlider = new JSlider(0, 100, 0); 
     final JSlider minValueSlider = new JSlider(0, 100, 0); 
     final JSlider maxValueSlider = new JSlider(0, 100, 0); 
     final JSlider valueSlider = new JSlider(0, 100, 0); 

     JPanel controlPanel = new JPanel(new GridLayout(0,2)); 
     controlPanel.add(new JLabel("minAngle")); 
     controlPanel.add(minAngleSlider); 
     controlPanel.add(new JLabel("maxAngle")); 
     controlPanel.add(maxAngleSlider); 
     controlPanel.add(new JLabel("minValue")); 
     controlPanel.add(minValueSlider); 
     controlPanel.add(new JLabel("maxValue")); 
     controlPanel.add(maxValueSlider); 
     controlPanel.add(new JLabel("value")); 
     controlPanel.add(valueSlider); 

     ChangeListener changeListener = new ChangeListener() 
     { 
      @Override 
      public void stateChanged(ChangeEvent e) 
      { 
       double minAngle = minAngleSlider.getValue()/100.0 * Math.PI * 2; 
       double maxAngle = maxAngleSlider.getValue()/100.0 * Math.PI * 2; 
       double minValue = minValueSlider.getValue()/100.0; 
       double maxValue = maxValueSlider.getValue()/100.0; 
       double value = valueSlider.getValue()/100.0; 

       gaugePanel.setAngles(minAngle, maxAngle); 
       gaugePanel.setRange(minValue, maxValue); 
       gaugePanel.setValue(value); 
      } 
     }; 
     minAngleSlider.addChangeListener(changeListener); 
     maxAngleSlider.addChangeListener(changeListener); 
     minValueSlider.addChangeListener(changeListener); 
     maxValueSlider.addChangeListener(changeListener); 
     valueSlider.addChangeListener(changeListener); 

     minAngleSlider.setValue(50); 
     maxAngleSlider.setValue(0); 
     minValueSlider.setValue(10); 
     maxValueSlider.setValue(90); 
     valueSlider.setValue(50); 

     return controlPanel; 
    } 


} 

class GaugePanel extends JPanel 
{ 
    private double minAngleRad = 0.0; 
    private double maxAngleRad = 0.0; 
    private double minValue = 0.0; 
    private double maxValue = 0.0; 
    private double value = 0.0; 

    void setAngles(double minAngleRad, double maxAngleRad) 
    { 
     this.minAngleRad = minAngleRad; 
     this.maxAngleRad = maxAngleRad; 
     repaint(); 
    } 

    void setRange(double minValue, double maxValue) 
    { 
     this.minValue = minValue; 
     this.maxValue = maxValue; 
     repaint(); 
    } 

    void setValue(double value) 
    { 
     this.value = value; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics gr) 
    { 
     super.paintComponent(gr); 
     Graphics2D g = (Graphics2D)gr; 
     g.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

     int ty = 20; 
     g.setColor(Color.BLACK); 
     g.drawString("minAngle "+Math.toDegrees(minAngleRad), 20, ty+=20); 
     g.drawString("maxAngle "+Math.toDegrees(maxAngleRad), 20, ty+=20); 
     g.drawString("minValue "+minValue, 20, ty+=20); 
     g.drawString("maxValue "+maxValue, 20, ty+=20); 
     g.drawString("value "+value, 20, ty+=20); 


     double alpha = (value - minValue)/(maxValue - minValue); 
     double angleRad = minAngleRad + alpha * (maxAngleRad - minAngleRad); 

     double length = Math.min(getWidth(), getHeight())/3.0; 

     double x0 = getWidth()/2.0; 
     double y0 = getHeight()/2.0; 
     double x1 = x0 + Math.cos(angleRad) * length; 
     double y1 = y0 - Math.sin(angleRad) * length; 

     g.setColor(Color.GREEN); 
     g.fill(new Arc2D.Double(
      x0-length, y0-length, 
      length+length, length+length, 
      Math.toDegrees(minAngleRad), 
      Math.toDegrees(maxAngleRad-minAngleRad), 
      Arc2D.PIE)); 

     g.setStroke(new BasicStroke(3.0f)); 
     g.setColor(Color.BLACK); 
     g.draw(new Line2D.Double(x0, y0, x1, y1)); 


    } 
} 
+0

고마워 임마. 그것을 시험하고 당신에게 돌아올 것입니다. – user3291628

+0

고마워요. 나는 내가 잘못 가고있는 곳을 발견했다. 내 코드는 괜찮 았어. 실수가 입력에있었습니다. 나는 시계 방향으로 입력을주고 있었고 코드는 그것을 반 시계 방향으로 원했다. – user3291628

관련 문제