傾きからこれも角度である
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、簡単なテストのために近づいたときに、これは明らかに無限大に近づくことに注意してください