[Lemon-commits] [lemon_svn] hegyi: r1644 - hugo/trunk/src/work/peter

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:46:45 CET 2006


Author: hegyi
Date: Thu Mar 17 12:45:05 2005
New Revision: 1644

Modified:
   hugo/trunk/src/work/peter/Makefile
   hugo/trunk/src/work/peter/canvas-test.cc

Log:
Magic triangle is a bit more DONE, and is already not only a triangle.

Modified: hugo/trunk/src/work/peter/Makefile
==============================================================================
--- hugo/trunk/src/work/peter/Makefile	(original)
+++ hugo/trunk/src/work/peter/Makefile	Thu Mar 17 12:45:05 2005
@@ -1,2 +1,2 @@
 triangle: canvas-test.cc
-	g++ canvas-test.cc -o triangle `pkg-config libgnomecanvasmm-2.6 --cflags --libs`
+	g++ canvas-test.cc -W -Wall -ansi -pedantic -o triangle `pkg-config libgnomecanvasmm-2.6 --cflags --libs`

Modified: hugo/trunk/src/work/peter/canvas-test.cc
==============================================================================
--- hugo/trunk/src/work/peter/canvas-test.cc	(original)
+++ hugo/trunk/src/work/peter/canvas-test.cc	Thu Mar 17 12:45:05 2005
@@ -16,26 +16,45 @@
 	virtual ~CanvasExample();
 
 private:
-	int noe;
 
+	///Event handler function that handles dragging nodes of triangle
+	bool event_handler(GdkEvent* e, bool b);
+
+	///Event handler function that handles dragging triangle
+	bool tri_mover(GdkEvent* e, bool b);
+
+	///Coordinates of Weight Point of tirangle
+	Gnome::Art::Point * wp;
+	///Array of nodes of planefigure
+	Gnome::Canvas::Ellipse ** nodes;
+	///Sides of planefigure
+	Gnome::Canvas::Polygon * sides;
+	///Group of graphical elements of triangle
+	Gnome::Canvas::Group triangle;
+
+	///Indicates whether the button of mouse is pressed or not
 	bool isbutton;
+
+	///Number Of Elements - the number of nodes
+	int noe;
+
+	///At this location was the mousebutton pressed.
+	///It helps to calculate the distance of dragging.
 	double clicked_x, clicked_y;
 
+	///Remembers which Gnome::Canvas::Item was pressed.
 	///this variable is needed, because
 	///1. we cannot query the item at he cursor as fast as it could not cause a Segmentation Fault
 	///2. we would like to handle only ony item per movement, therefore quering it is not a working solution
 	Gnome::Canvas::Item * active_item;
 
-	bool event_handler(GdkEvent* e, bool b);
-	bool tri_mover(GdkEvent* e, bool b);
-	Gnome::Art::Point * wp;
-	Gnome::Canvas::Ellipse ** nodes;
-	Gnome::Canvas::Polygon * sides;
-	Gnome::Canvas::Group triangle;
+
 };
 
+///When we click on the weight point we can drag the whole triangle. This function resolves it.
 bool CanvasExample::tri_mover(GdkEvent* e, bool b)
 {
+	b=b;
 	switch(e->type)
 	{
 		case GDK_BUTTON_PRESS:
@@ -50,13 +69,9 @@
 		case GDK_MOTION_NOTIFY:
 			if(isbutton)
 			{
-				//double x1, y1, x2, y2;
-				//(get_item_at(e->motion.x, e->motion.y))->get_bounds(x1, y1, x2, y2);
-				//printf("Item coos: %d %d %d %d\n", (int)x1, (int)y1, (int)x2, (int)y2);
-				//printf("Mouse is moved! %d %d\n",(int)e->motion.x,(int)e->motion.y);
 				double dx=e->motion.x-clicked_x;
 				double dy=e->motion.y-clicked_y;
-				for(int i=0;i<=noe/2;i++)
+				for(int i=0;i<=noe;i++)
 				{
 					nodes[i]->move(dx,dy);
 				}
@@ -64,7 +79,7 @@
 				clicked_y=e->motion.y;
 
 				Gnome::Canvas::Points coos;
-				for(int i=0;i<noe/2;i++)
+				for(int i=0;i<noe;i++)
 				{
 					double x1,y1,x2,y2;
 					nodes[i]->get_bounds(x1,y1,x2,y2);
@@ -77,10 +92,15 @@
 			}
 		default: break;
 	}
+	return true;
 }
 
+///This function moves only one node of triangle,
+///but recalculate the location of wight point,
+///and also redraw the sides of the planefigure.
 bool CanvasExample::event_handler(GdkEvent* e, bool b)
 {
+	b=b;
 	switch(e->type)
 	{
 		case GDK_BUTTON_PRESS:
@@ -109,7 +129,7 @@
 				double x_wp=0;
 				double y_wp=0;
 
-				for(int i=0;i<noe/2;i++)
+				for(int i=0;i<noe;i++)
 				{
 					double x1,y1,x2,y2;
 					nodes[i]->get_bounds(x1,y1,x2,y2);
@@ -117,61 +137,58 @@
 					double y=(y1+y2)/2;
 					coos.push_back(Gnome::Art::Point(x, y));
 
-					if(i<3)
-					{
-						x_wp+=x;
-						y_wp+=y;
-					}
+					x_wp+=x;
+					y_wp+=y;
 				}
 
 				sides->property_points().set_value(coos);
 
-				x_wp/=3;
-				y_wp/=3;
+				x_wp/=noe;
+				y_wp/=noe;
 
 				double x1,y1,x2,y2;
-				nodes[noe/2]->get_bounds(x1,y1,x2,y2);
+				nodes[noe]->get_bounds(x1,y1,x2,y2);
 				double x=(x1+x2)/2;
 				double y=(y1+y2)/2;
 
 				dx=x_wp-x;
 				dy=y_wp-y;
-				nodes[noe/2]->move(dx, dy);
+				nodes[noe]->move(dx, dy);
 
 				clicked_x=e->motion.x;
 				clicked_y=e->motion.y;
 			}
 		default: break;
 	}
+	return true;
 }
 
-CanvasExample::CanvasExample(double * coosarray, int numofels):triangle(*(root()), 0, 0),isbutton(false),active_item(NULL)
+CanvasExample::CanvasExample(double * coosarray, int numofcoos):triangle(*(root()), 0, 0),isbutton(false),active_item(NULL)
 {
-	noe=numofels;
+	noe=numofcoos/2;
 
-	int j=0;
-	double ax=coosarray[j++];
-	double ay=coosarray[j++];
-	double bx=coosarray[j++];
-	double by=coosarray[j++];
-	double cx=coosarray[j++];
-	double cy=coosarray[j++];
+	double x_wp=0;
+	double y_wp=0;
 
 	Gnome::Canvas::Points coos;
-	for(int i=0;i<noe;i++)
+	for(int i=0;i<numofcoos;i++)
 	{
 		double x=coosarray[i++];
 		double y=coosarray[i];
 		coos.push_back(Gnome::Art::Point(x, y));
+
+		x_wp+=x;
+		y_wp+=y;
+
 	}
 
 	sides=new Gnome::Canvas::Polygon(triangle, coos);
 	*sides << Gnome::Canvas::Properties::outline_color("green");
 	sides->property_width_pixels().set_value(10);
 
-	nodes=new ( Gnome::Canvas::Ellipse * ) [noe/2+1];
+	nodes=new Gnome::Canvas::Ellipse* [noe+1];
 
-	for(int i=0; i<noe/2;i++)
+	for(int i=0; i<noe;i++)
 	{
 		nodes[i]= new Gnome::Canvas::Ellipse(triangle, coos[i].get_x()-20, coos[i].get_y()-20, coos[i].get_x()+20, coos[i].get_y()+20);
 		*(nodes[i]) << Gnome::Canvas::Properties::fill_color("blue");
@@ -179,12 +196,12 @@
 		(nodes[i])->signal_event().connect(sigc::bind(sigc::mem_fun(*this, &CanvasExample::event_handler),true));
 	}
 
-	wp=new Gnome::Art::Point((ax+bx+cx)/3,(ay+by+cy)/3);
+	wp=new Gnome::Art::Point(x_wp/noe,y_wp/noe);
 
-	nodes[noe/2]= new Gnome::Canvas::Ellipse(triangle, wp->get_x()-20, wp->get_y()-20, wp->get_x()+20, wp->get_y()+20);
-	*(nodes[noe/2]) << Gnome::Canvas::Properties::fill_color("blue");
-	*(nodes[noe/2]) << Gnome::Canvas::Properties::outline_color("black");
-	(nodes[noe/2])->signal_event().connect(sigc::bind(sigc::mem_fun(*this, &CanvasExample::tri_mover),true));
+	nodes[noe]= new Gnome::Canvas::Ellipse(triangle, wp->get_x()-20, wp->get_y()-20, wp->get_x()+20, wp->get_y()+20);
+	*(nodes[noe]) << Gnome::Canvas::Properties::fill_color("blue");
+	*(nodes[noe]) << Gnome::Canvas::Properties::outline_color("black");
+	(nodes[noe])->signal_event().connect(sigc::bind(sigc::mem_fun(*this, &CanvasExample::tri_mover),true));
 
 
 }
@@ -205,7 +222,7 @@
 	CanvasExample m_canvas;
 };
 
-MainWin::MainWin(const std::string& title, double * coosarray, int noe):m_canvas(coosarray, noe)
+MainWin::MainWin(const std::string& title, double * coosarray, int noc):m_canvas(coosarray, noc)
 {
 	set_title (title);
 	add(m_canvas);
@@ -234,7 +251,5 @@
 		app.run(mainwin);
 	}
 
-	printf("Usage:\n./triangle x1 y1 x2 y2 x3 y3\nWhere xi and yi are the coordinates of the points of the triangle\n");
-
 	return 0;
 }



More information about the Lemon-commits mailing list