2017-06-25 8 views
2

JavaとJPanelを使って赤い線を描画しています。赤い線は任意の傾きとy切片を持つことができますが、両方とも計算されます。別の行から一定距離の平行線のy切片を見つける方法

黄色の平行線は、赤い線から250px離れて描画する必要があります。どのように黄色の平行線のy切片を計算するでしょうか?

次の図は、赤と黄色の線がどのように見えるかの例です。また、これはJPanelであるため、原点は左上にあり、y値はすべて正です。

y切片図:

diagram

答えて

0

傾きからこれも角度である

double angleRad = Math.atan(slope); 

ように、あなたは、x軸にラインが有する角度を計算することができますあなたの画像の小さな三角形の角にある0,??の角(あなたが灰色で描いた角度は直角です)。その

  side adjacent to angle a 
cos(a) = ------------------------- 
       hypotenuse 

し、角度(250なければならないあなたの青線のすなわち、長さ)に隣接する側の所望の長さを有していることを考えると、あなたの長さを計算することができるが想起

斜辺は

hypotenuse = 250/cos(a) 

となり、基本的に赤い線を(負の)y方向にシフトさせて黄色の線にする必要があります。

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.Line2D; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 

public class ParallelLineInterceptTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(() -> createAndShowGUI()); 
    } 

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

     ParallelLineInterceptTestPanel p = new ParallelLineInterceptTestPanel(); 
     JPanel controlPanel = new JPanel(new GridLayout(1,0)); 

     controlPanel.add(new JLabel("slope: ", SwingConstants.RIGHT)); 
     JSlider slopeSlider = new JSlider(0, 1000, 50); 
     slopeSlider.addChangeListener(e -> 
     { 
      int slopeValue = slopeSlider.getValue(); 
      p.setSlope(slopeValue/100.0); 
     }); 
     controlPanel.add(slopeSlider); 

     f.getContentPane().setLayout(new BorderLayout()); 
     f.getContentPane().add(controlPanel, BorderLayout.NORTH); 
     f.getContentPane().add(p, BorderLayout.CENTER); 
     f.setSize(1200,800); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 


class ParallelLineInterceptTestPanel extends JPanel 
{ 
    private double slope; 
    private double yIntercept; 

    public ParallelLineInterceptTestPanel() 
    { 
     this.slope = 0.5; 
     this.yIntercept = 500; 
    } 

    public void setSlope(double slope) 
    { 
     this.slope = slope; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics gr) 
    { 
     super.paintComponent(gr); 
     Graphics2D g = (Graphics2D)gr; 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

     double x0 = 0; 
     double y0 = yIntercept; 
     double x1 = getWidth(); 
     double y1 = y0 + slope * getWidth(); 

     g.setColor(Color.RED); 
     g.draw(new Line2D.Double(x0, y0, x1, y1)); 

     double distance = 250.0; 
     double angleRad = Math.atan(slope); 
     double offsetY = distance/Math.cos(angleRad); 
     double px0 = x0; 
     double py0 = y0 - offsetY; 
     double px1 = x1; 
     double py1 = y1 - offsetY; 

     g.setColor(Color.ORANGE); 
     g.draw(new Line2D.Double(px0, py0, px1, py1)); 


    } 
} 
:角度が90°....

アンMCVE、簡単なテストのために近づいたときに、これは明らかに無限大に近づくことに注意してください

関連する問題