📄 mainframeelipsa.java
字号:
{
sp2 = solutii[i];
break;
}
}
}
int d1 = ( x1 - sp1 ) * ( x1 - sp1 ) + ( y1 - y ) * ( y1 - y );
int d2 = ( x1 - sp2 ) * ( x1 - sp2 ) + ( y1 - y ) * ( y1 - y );
int d3 = ( x2 - sp1 ) * ( x2 - sp1 ) + ( y2 - y ) * ( y2 - y );
int d4 = ( x2 - sp2 ) * ( x2 - sp2 ) + ( y2 - y ) * ( y2 - y );
if( d1 > r1 * r1 || d2 > r1 * r1 || d3 > r2 * r2 || d4 > r2 * r2 ) continue;
Linie(sp1, y, sp2, y);
}
}
private void FillIntersectieDacaSeIntersecteaza(int x1, int y1, int r1, int x2, int y2, int r2)
{
// folosind doar functia line
// daca nu se intersecteaza, return
if( Math.sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) ) >= r1 + r2 ) return;
// daca se ajunge aici, se intersecteaza cercurile
// acum, trebuie ca conturez intersectia
// Avem mai multe cazuri:
// 1) x1 = x2, y2 = y2, r1 = r2
// caz banal, se coloreaza intregul cerc
//`
// 2) un cerc e in interiorul altuia, ce coloreaza cercul din interior (alt caz banal)
// 2.1) (x1 + r1 <= x2 + r2) && (x1 - r1 >= x2 - r2) && (y1 + r1 <= y2 + r2) && (y1 - r1 >= y2 - r2)
// 2.2) (x2 + r2 <= x1 + r1) && (x2 - r2 >= x1 - r1) && (y2 + r2 <= y1 + r1) && (y2 - r2 >= y1 - r1)
//
// 3) x1 <= x2
// 3.1) y1 <= y2 "cercul 1 e in stanga-sus fata de cercul 2"
// 3.2) y1 > y2 "cercul 1 e in stanga-jos fata de cercul 2"
// 4) x2 > x1
// 4.1) y2 <= y1 "cercul 2 e in stanga-sus fata de cercul 1"
// 4.2) y1 > y1 "cercul 2 e in stanga-jos fata de cercul 1"
if(x1 == x2 && y1 == y2 && r1 == r2)
{
// cercurile coincid, deci hasurez intregul cerc comun
for(double t=0.0; t<=2 * Math.PI; t+=0.001)
Linie(x1, y1, x1 + r1 * Math.cos(t), y1 + r1 * Math.sin(t));
return;
}
if( (x1 + r1 <= x2 + r2) && (x1 - r1 >= x2 - r2) && (y1 + r1 <= y2 + r2) && (y1 - r1 >= y2 - r2) )
{
// cercul 1 e in cercul 2, hasurez cercul 1
for(double t=0.0; t<=2 * Math.PI; t+=0.001)
Linie(x1, y1, x1 + r1 * Math.cos(t), y1 + r1 * Math.sin(t));
return;
}
if( (x2 + r2 <= x1 + r1) && (x2 - r2 >= x1 - r1) && (y2 + r2 <= y1 + r1) && (y2 - r2 >= y1 - r1) )
{
// cercul 2 e in cercul 1, hasurez cercul 2
for(double t=0.0; t<=2 * Math.PI; t+=0.001)
Linie(x2, y2, x2 + r2 * Math.cos(t), y2 + r2 * Math.sin(t));
return;
}
// 2.2)
if(x1 <= x2)
if( y1 <= y2)
{
double m = (double)(y2 -y1 ) / (double)(x2 - x1);
double n = - (m * (double)x1) + (double)y1;
// f(x) = m * x + n ecuatia dreptei det de cele 2 centre
// ideea este sa umplu intersectia cu segmente, ce au o extremitate undeva in interiorul intersectiei, si cealalta se plimba pe contur
// conturul insa e format din 2 parti: partea "de ecuatie cerc 1" si "de ecuatie cerc 2"
//
// ecuatie cerc 1:
// ( r1 * cos(t) , r1 * sin(t) )
//
// ecuatie cerc 2:
// ( r2 * cos(t) , r2 * sin(t) )
//
// pentru asta, imi trebuie radianii t1 si t2 (ai punctelor de intersectie)
// aflu distanta dintre cele 2 cercuri, d, si am 2 triunghiuri dreptunghice, tin cont ca d = a + b si din pitagore + asta imi ies a si b
// apoi, bag in ecuatia dreptei de mai sus f(x + a) si imi rezulta coordonatele punctului din "centrul intersectiei"
//
// apoi, se scrie ecuatia dreptei perpendiculare pe dreapta determinata de cele 2 centre, in punctul ( x + a, f ( x + a ) ) (centrul intersectiei)
//
//
double d = Math.sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) );
double b = ( ((double)r2 * (double)r2) - ((double)r1 * (double)r1) + (d * d) ) / (2 * d);
double a;
a = d - b;
//lse a = b - d;
// declarate global in clasa
if( a<0 )
{
a = b - d;
centruIntersectieX = (double)x1 - Math.sqrt( (a * a) / ( (m * m) + 1) );
}
else
{
centruIntersectieX = (double)x1 + Math.sqrt( (a * a) / ( (m * m) + 1) );
}
//double centruIntersectieX = x1 + a;
centruIntersectieY = (m * ( centruIntersectieX )) + n;
System.out.println("m = " + Double.toString(m) );
System.out.println("n = " + Double.toString(n) );
System.out.println("d = " + Double.toString(d) );
System.out.println("b = " + Double.toString(b) );
System.out.println("a = " + Double.toString(a) );
System.out.println("centruIntersectieX = " + Double.toString(centruIntersectieX) );
System.out.println("centruIntersectieY = " + Double.toString(centruIntersectieY) );
// Linie(200, 200, 500, 500 );
// scriu ecuatia dreptei perpendiculare pe dreapta det de cele 2 cercuri
// are panta m2 = -(1/m) si n2 iese din ecuatia y = (-1 / m) * x + n, cu m de mai sus, si x = centruIntersectieX, y = centruIntersectieY;
double m2 = - (1 / m);
double n2 = centruIntersectieY + centruIntersectieX / m;
double h = Math.sqrt(r1 * r1 - a * a);
System.out.println("m2 = " + Double.toString(m2) );
System.out.println("n2 = " + Double.toString(n2) );
// acum, ( centruIntersectieX, f2(centruintersectieX + h) ) si ( centruIntersectieX, f2(centruintersectieX -h ) )
// sunt punctele in care se intersecteaza cercurile (nu interiorul lor)
double punct1IntersectieCercX = (double)centruIntersectieX + Math.sqrt( (h * h) / ( (m2 * m2) + 1) );
double punct1IntersectieCercY = m2 * (punct1IntersectieCercX) + n2;
double punct2IntersectieCercX = (double)centruIntersectieX - Math.sqrt( (h * h) / ( (m2 * m2) + 1) );
double punct2IntersectieCercY = m2 * (punct2IntersectieCercX) + n2;
Linie((int)centruIntersectieX, (int)centruIntersectieY, (int)punct1IntersectieCercX, (int)punct1IntersectieCercY);
Linie((int)centruIntersectieX, (int)centruIntersectieY, (int)punct2IntersectieCercX, (int)punct2IntersectieCercY);
System.out.println("punct1IntersectieCercX = " + Double.toString(punct1IntersectieCercX) );
System.out.println("punct1IntersectieCercY = " + Double.toString(punct1IntersectieCercY) );
System.out.println("punct2IntersectieCercX = " + Double.toString(punct2IntersectieCercX) );
System.out.println("punct2IntersectieCercY = " + Double.toString(punct2IntersectieCercY) );
// apoi, de exemplu, din din r1 * cos(t1) = punct1IntersectieCercX, scot pe t1, exprimat ca arccos ( punct1IntersectieCercX / r1 )
double expr = (punct1IntersectieCercX - (double)x1 )/ (double)r1;
double t1 = Math.acos( expr ) ;
t1 = -t1;
expr = (punct2IntersectieCercX - (double)x1 )/ (double)r1;
double t2 = Math.acos( expr );
System.out.println("t1 = " + Double.toString(t1) );
System.out.println("t2 = " + Double.toString(t2) );
// trasez segmente cu o extremitate in centrul de intersectie, si cealalalta la (r1 * cost(t), r1 * sin(t) ) pentru t in (t1, t2)
for(double t = t1; t<= t2; t+=0.01)
Linie((int)centruIntersectieX, (int)centruIntersectieY, (int)(x1 + (r1 * Math.cos(t))), (int)(y1 + (r1 * Math.sin(t))));
if(y1 + r1 <= y2)
{
expr = (punct2IntersectieCercX - (double)x2 )/ (double)r2;
t1 = -Math.acos( expr );
expr = (punct1IntersectieCercX - (double)x2 )/ (double)r2;
t2 = -Math.acos( expr );
}
else
{
expr = (punct2IntersectieCercX - (double)x2 )/ (double)r2;
t1 = Math.acos( expr );
expr = (punct1IntersectieCercX - (double)x2 )/ (double)r2;
t2 = -Math.acos( expr ) + 2 * Math.PI;
}
System.out.println("t1 = " + Double.toString(t1) );
System.out.println("t2 = " + Double.toString(t2) );
// trasez segmente cu o extremitate in centrul de intersectie, si cealalalta la (r1 * cost(t), r1 * sin(t) ) pentru t in (t1, t2)
//for(double t = t1; t<= t2; t+=0.01)
for( double t = t1; t <= t2; t+=0.01 )
Linie((int)centruIntersectieX, (int)centruIntersectieY, (int)(x2 + (r2 * Math.cos(t))), (int)(y2 + (r2 * Math.sin(t))));
}
}
@Override
public void mouseDragged(MouseEvent e)
{
//int x2 = e.getX();
//int y2 = e.getY();
//Linie((int)centruIntersectieX, (int)centruIntersectieY, x2, y2 );
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
x2 = e.getX();
y2 = e.getY();
//amDeCalculatCeva = true;
// r1 = r1 o las la fel
}
public void run()
{
if(Thread.currentThread() == trdRefreshScreen)
{
while(true)
{
theGraphics.setColor(Color.black);
theGraphics.fillRect(0, 0, getWidth(), getHeight());
theGraphics.setColor(Color.white);
theGraphics.drawArc(x1 - r1, y1 - r1, r1*2, r1*2, 0, 360);
theGraphics.drawArc(x2 - r2, y2 - r2, r2*2, r2*2, 0, 360);
//FillIntersectieDacaSeIntersecteaza(x1, y1, r1, x2, y2, r2);
FillIntersectieCercuriLiniiOrizontale(x1, y1, r1, x2, y2, r2);
repaint();
//g.fillArc(30, 30, 100, 100, 30, 90);
//g.drawArc
//g.drawLine(x1, y1, x2, y2);
//g.fillOval(x1 -r1 , y1 -r1, x1 + r1, y1 + r1);
//FillIntersectieDacaSeIntersecteaza(x1, y1, r1, x2, y2, r2);
try
{
Thread.sleep(1000/fps);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent e)
{
// TODO Auto-generated method stub
//r1 += e.getScrollAmount();
if(e.getWheelRotation() >= 0 )
{
r2 += (5 * e.getWheelRotation());
if(r2 >= 300) r2 = 300;
}
else
{
r2 += (5 * e.getWheelRotation());
if(r2 <= 20) r2 = 20;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -