⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframeelipsa.java

📁 Java project demonstrating how to obtain the intersection of two circles.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		    {
		     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 + -