📄 mainframeelipsa.java
字号:
package adim.swing;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class MainFrameElipsa extends JFrame implements WindowListener
{
private static final long serialVersionUID = 1L;
private JPanel mainPanel;
private CanvasElipse theCanvas;
MainFrameElipsa()
{
mainPanel = new JPanel();
mainPanel.setLayout(null);
mainPanel.setPreferredSize(new Dimension(640, 480));
setContentPane(mainPanel);
addWindowListener(this);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
theCanvas = new CanvasElipse();
theCanvas.setSize(new Dimension(640, 480));
mainPanel.add(theCanvas);
setTitle("Elipse");
setLocation(200, 200);
pack();
setVisible(true);
}
public static void main(String[] args)
{
new MainFrameElipsa();
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
dispose();
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
}
class CanvasElipse extends Canvas implements MouseMotionListener, Runnable, MouseWheelListener
{
boolean amDeCalculatCeva;
BufferedImage imgOffScreenBuffer;
Graphics theGraphics;
Thread trdRefreshScreen;
//Thread trdCalculIntersectie;
int fps = 60;
private double centruIntersectieX, centruIntersectieY;
private boolean primaData ;
private int x1, y1, r1, x2, y2, r2;
CanvasElipse()
{
//JOptionPane.showInputDialog("constructor");
addMouseMotionListener(this);
addMouseWheelListener(this);
amDeCalculatCeva = false;
x1 = 420;
y1 = 213;
r1 = 100;
x2 = 420;
y2 = 213;
r2 = 100;
imgOffScreenBuffer = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);
theGraphics = imgOffScreenBuffer.getGraphics();
/*
x1 = 360;
y1 = 190;
r1 = 60;
x2 = 420;
y2 = 213;
r2 = 100;
*/
trdRefreshScreen = new Thread(this);
trdRefreshScreen.start();
//trdCalculIntersectie = new Thread(this);
//trdCalculIntersectie.start();
primaData = true;
}
public void paint(Graphics g)
{
g.drawImage(imgOffScreenBuffer, 0, 0, 640, 480, this);
}
public void update(Graphics g)
{
paint(g);
}
private void Linie(double x1, double y1, double x2, double y2)
{
theGraphics.setColor(Color.white);
theGraphics.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
}
private void FillIntersectieCercuriLiniiOrizontale(int x1, int y1, int r1, int x2, int y2, int r2)
{
if( ( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) ) >= (r1 + r2) * (r1 + r2) ) return;
// se intersecteaza, determin yStart (y cel mai mic, a.i e pe unul dintre cercuri)
// apoi, pentru y de la yStart in jos, verific daca dreapta
int yStart;
if(y1 - r1 > y2 - r2)
yStart = y1 - r1;
else
yStart = y2 - r2;
// faza 0 parcurg liniile incepand de la cel mai de sus punct al cercului de sus, pana cand obtin solutii comune
// (adica, aflu primul punct de intersectie dintre cercuri)
// faza 1 completez liniie, si testez daca am ajuns la cealalta intersectie dintre cercuri; daca am ajuns, stop
//Linie(0, yStart, getWidth(), yStart);
for(int y = yStart; true; y++)
{
// scot solutiile s1, s2, s3 si s4, ce reprezinta intersectia dreptei f(x) = y
// cu cercurile c1, si c2, de ecuatie
// (x - x1) ^ 2 + (y - y1) ^ 2 = r1 ^ 2 si
// (x - x2) ^ 2 + (y - y2) ^ 2 = r2 ^ 2
int deltaCerc1 = (r1 * r1) - ((y-y1) * (y-y1)) ;
int deltaCerc2 = (r2 * r2) - ((y-y2) * (y-y2)) ;
//double epsilon = 0.01;
if(deltaCerc1 < 0 || deltaCerc2 < 0 ) break;
// aflu solutiile s1, s2, s3, s4
int solutii[] = new int[4];
solutii[0] = x1 - (int)Math.sqrt(deltaCerc1);
solutii[1] = x1 + (int)Math.sqrt(deltaCerc1);
solutii[2] = x2 - (int)Math.sqrt(deltaCerc2);
solutii[3] = x2 + (int)Math.sqrt(deltaCerc2);
// aleg solutiile potrivite, in sp1, sp2
int sp1=0, sp2=0;
int solutieMinima = Math.min( Math.min( Math.min(solutii[0], solutii[1]), solutii[2]), solutii[3] );
int solutieMaxima = Math.max( Math.max( Math.max(solutii[0], solutii[1]), solutii[2]), solutii[3] );
boolean amGasitMinim = false;
boolean amGasitMaxim = false;
int solCount = 0;
for(int i=0; i<4; i++)
{
if( amGasitMinim == false && solutii[i] == solutieMinima )
{
amGasitMinim = true;
continue;
}
if( amGasitMaxim == false && solutii[i] == solutieMaxima )
{
amGasitMaxim = true;
continue;
}
if( amGasitMinim == true && solutii[i] == solutieMinima )
{
if(solCount==0)
{
solCount++;
sp1 = solutii[i];
}
else
{
sp2 = solutii[i];
break;
}
}
if( amGasitMaxim == true && solutii[i] == solutieMaxima )
{
if(solCount==0)
{
solCount++;
sp1 = solutii[i];
}
else
{
sp2 = solutii[i];
break;
}
}
if(solutii[i] != solutieMinima && solutii[i] != solutieMaxima)
{
if(solCount == 0)
{
solCount++;
sp1 = solutii[i];
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -