perspective projection in vecmat3 and tX test program
This commit is contained in:
		
							parent
							
								
									2922330c80
								
							
						
					
					
						commit
						c24efe43a1
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -51,6 +51,7 @@ config.log
 | 
				
			|||||||
libla.la
 | 
					libla.la
 | 
				
			||||||
t
 | 
					t
 | 
				
			||||||
test
 | 
					test
 | 
				
			||||||
 | 
					tX
 | 
				
			||||||
*.tar.bz2
 | 
					*.tar.bz2
 | 
				
			||||||
.*.swp
 | 
					.*.swp
 | 
				
			||||||
# CVS default ignores end
 | 
					# CVS default ignores end
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,10 @@
 | 
				
			|||||||
lib_LTLIBRARIES = libla.la
 | 
					lib_LTLIBRARIES = libla.la
 | 
				
			||||||
include_HEADERS = simple.h vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h bitvector.h   fourindex.h  la_traits.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h contfrac.h
 | 
					include_HEADERS = simple.h vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h bitvector.h   fourindex.h  la_traits.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h contfrac.h
 | 
				
			||||||
libla_la_SOURCES = simple.cc quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc contfrac.cc
 | 
					libla_la_SOURCES = simple.cc quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc contfrac.cc
 | 
				
			||||||
check_PROGRAMS = t test
 | 
					check_PROGRAMS = t test tX
 | 
				
			||||||
t_SOURCES = t.cc t2.cc 
 | 
					t_SOURCES = t.cc t2.cc 
 | 
				
			||||||
test_SOURCES = test.cc
 | 
					test_SOURCES = test.cc
 | 
				
			||||||
 | 
					tX_SOURCES = tX.cc
 | 
				
			||||||
LDADD = .libs/libla.a
 | 
					LDADD = .libs/libla.a
 | 
				
			||||||
ACLOCAL_AMFLAGS = -I m4
 | 
					ACLOCAL_AMFLAGS = -I m4
 | 
				
			||||||
EXTRA_DIST = LICENSE doxygen.cfg aminclude.am acinclude.m4 footer.html
 | 
					EXTRA_DIST = LICENSE doxygen.cfg aminclude.am acinclude.m4 footer.html
 | 
				
			||||||
@ -31,4 +32,6 @@ AM_LDFLAGS += $(ATLASLIB)
 | 
				
			|||||||
AM_LDFLAGS += $(MKLLIB)
 | 
					AM_LDFLAGS += $(MKLLIB)
 | 
				
			||||||
AM_LDFLAGS += $(CUDALIBS)
 | 
					AM_LDFLAGS += $(CUDALIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tX_LDFLAGS = $(AM_LDFLAGS) -lX11 -lm 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(top_srcdir)/aminclude.am
 | 
					include $(top_srcdir)/aminclude.am
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								mat.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mat.h
									
									
									
									
									
								
							@ -497,7 +497,7 @@ NRMat<T>::NRMat(const T &a, const int n, const int m, const GPUID loc) : nn(n),
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * inline constructor creating vector from an array
 | 
					 * inline constructor creating matrix from an array
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										355
									
								
								tX.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										355
									
								
								tX.cc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,355 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					    LA: linear algebra C++ interface library graphical test program
 | 
				
			||||||
 | 
					    Copyright (C) 2022 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "la.h"
 | 
				
			||||||
 | 
					#include "vecmat3.h"
 | 
				
			||||||
 | 
					#include "quaternion.h"
 | 
				
			||||||
 | 
					#include "permutation.h"
 | 
				
			||||||
 | 
					#include "polynomial.h"
 | 
				
			||||||
 | 
					#include "contfrac.h"
 | 
				
			||||||
 | 
					#include "simple.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
 | 
					#include <X11/keysym.h>
 | 
				
			||||||
 | 
					#include <X11/Xos.h>
 | 
				
			||||||
 | 
					#include <X11/Xutil.h>
 | 
				
			||||||
 | 
					#include <X11/Xatom.h>
 | 
				
			||||||
 | 
					#include <X11/Xresource.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					using namespace LA_Vecmat3;
 | 
				
			||||||
 | 
					using namespace LA_Quaternion;
 | 
				
			||||||
 | 
					using namespace LA_Simple;
 | 
				
			||||||
 | 
					using namespace LA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* function: create_simple_window. Creates a window with a white background
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					in the given size.
 | 
				
			||||||
 | 
					* input:
 | 
				
			||||||
 | 
					display, size of the window (in pixels), and location of the window
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					(in pixels).
 | 
				
			||||||
 | 
					* output:
 | 
				
			||||||
 | 
					the window's ID.
 | 
				
			||||||
 | 
					* notes:
 | 
				
			||||||
 | 
					window is created with a black border, 2 pixels wide.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					the window is automatically mapped after its creation.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Window create_simple_window(Display* display, int width, int height, int x, int y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int screen_num = DefaultScreen(display);
 | 
				
			||||||
 | 
					int win_border_width = 2;
 | 
				
			||||||
 | 
					Window win;
 | 
				
			||||||
 | 
					/* create a simple window, as a direct child of the screen's */
 | 
				
			||||||
 | 
					/* root window. Use the screen's black and white colors as
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/* the foreground and background colors of the window,
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/* respectively. Place the new window's top-left corner at
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/* the given 'x,y' coordinates.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					win = XCreateSimpleWindow(display, RootWindow(display, screen_num),
 | 
				
			||||||
 | 
					x, y, width, height, win_border_width,
 | 
				
			||||||
 | 
					BlackPixel(display, screen_num),
 | 
				
			||||||
 | 
					WhitePixel(display, screen_num));
 | 
				
			||||||
 | 
					/* make the window actually appear on the screen. */
 | 
				
			||||||
 | 
					XMapWindow(display, win);
 | 
				
			||||||
 | 
					/* flush all pending requests to the X server. */
 | 
				
			||||||
 | 
					XFlush(display);
 | 
				
			||||||
 | 
					return win;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GC create_gc(Display* display, Window win)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					GC gc;
 | 
				
			||||||
 | 
					/* handle of newly created GC. */
 | 
				
			||||||
 | 
					unsigned long valuemask = 0;
 | 
				
			||||||
 | 
					/* which values in 'values' to */
 | 
				
			||||||
 | 
					/* check when creating the GC. */
 | 
				
			||||||
 | 
					XGCValues values;
 | 
				
			||||||
 | 
					/* initial values for the GC.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					unsigned int line_width = 1;
 | 
				
			||||||
 | 
					/* line width for the GC.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int line_style = LineSolid;
 | 
				
			||||||
 | 
					/* style for lines drawing and */
 | 
				
			||||||
 | 
					int cap_style = CapButt;
 | 
				
			||||||
 | 
					/* style of the line's edje and */
 | 
				
			||||||
 | 
					int join_style = JoinBevel;
 | 
				
			||||||
 | 
					/* joined lines.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int screen_num = DefaultScreen(display);
 | 
				
			||||||
 | 
					gc = XCreateGC(display, win, valuemask, &values);
 | 
				
			||||||
 | 
					if (!gc) {
 | 
				
			||||||
 | 
					fprintf(stderr, "error XCreateGC: \n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/* define the style of lines that will be drawn using this GC. */
 | 
				
			||||||
 | 
					XSetLineAttributes(display, gc,
 | 
				
			||||||
 | 
					line_width, line_style, cap_style, join_style);
 | 
				
			||||||
 | 
					/* define the fill style for the GC. to be 'solid filling'. */
 | 
				
			||||||
 | 
					XSetFillStyle(display, gc, FillSolid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return gc;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					Vec3<double> point0;
 | 
				
			||||||
 | 
					Vec3<double> point1;
 | 
				
			||||||
 | 
					} LINE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<>
 | 
				
			||||||
 | 
					class LA::LA_traits<LINE> {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					        static bool is_plaindata() {return true;};
 | 
				
			||||||
 | 
						typedef double normtype;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void plotobject(Display* display, Pixmap pixmap, GC gc, int width,int height, const NRVec<LINE> &lines, const Mat3<double> &camera_angle, const Vec3<double> &camera, const Vec3<double> &plane_to_camera, double xod,double xdo,double yod,double ydo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					for(int i=0; i<lines.size(); ++i)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						double xy0[2],xy1[2];
 | 
				
			||||||
 | 
						perspective(&xy0[0], lines[i].point0, camera_angle, camera, plane_to_camera);
 | 
				
			||||||
 | 
						perspective(&xy1[0], lines[i].point1, camera_angle, camera, plane_to_camera);
 | 
				
			||||||
 | 
						int x0,x1,y0,y1;
 | 
				
			||||||
 | 
					        x0=width*(xy0[0]-xod)/(xdo-xod);
 | 
				
			||||||
 | 
					        x1=width*(xy1[0]-xod)/(xdo-xod);
 | 
				
			||||||
 | 
					        y0=height-height*(xy0[1]-yod)/(ydo-yod);
 | 
				
			||||||
 | 
					        y1=height-height*(xy1[1]-yod)/(ydo-yod);
 | 
				
			||||||
 | 
					        XDrawLine(display, pixmap, gc, x0, y0, x1, y1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					sigtraceback(SIGSEGV,1);
 | 
				
			||||||
 | 
					sigtraceback(SIGABRT,1);
 | 
				
			||||||
 | 
					sigtraceback(SIGBUS,1);
 | 
				
			||||||
 | 
					sigtraceback(SIGFPE,1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//cout.setf(ios::scientific);
 | 
				
			||||||
 | 
					cc:cout.setf(ios::fixed);
 | 
				
			||||||
 | 
					cout.precision(10);
 | 
				
			||||||
 | 
					cin.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Display* display;
 | 
				
			||||||
 | 
					// pointer to X Display structure.
 | 
				
			||||||
 | 
					int screen_num;
 | 
				
			||||||
 | 
					// number of screen to place the window on.
 | 
				
			||||||
 | 
					Window win;
 | 
				
			||||||
 | 
					// pointer to the newly created window.
 | 
				
			||||||
 | 
					unsigned int display_width,
 | 
				
			||||||
 | 
					display_height; // height and width of the X display.
 | 
				
			||||||
 | 
					unsigned int width, height;
 | 
				
			||||||
 | 
					// height and width for the new window.
 | 
				
			||||||
 | 
					char *display_name = getenv("DISPLAY"); // address of the X display.
 | 
				
			||||||
 | 
					GC gc;
 | 
				
			||||||
 | 
					// GC (graphics context) used for drawing in our window.
 | 
				
			||||||
 | 
					// open connection with the X server. 
 | 
				
			||||||
 | 
					display = XOpenDisplay(display_name);
 | 
				
			||||||
 | 
					if (display == NULL) {
 | 
				
			||||||
 | 
					fprintf(stderr, "%s: cannot connect to X server '%s'\n",
 | 
				
			||||||
 | 
					argv[0], display_name);
 | 
				
			||||||
 | 
					exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/* get the geometry of the default screen for our display. */
 | 
				
			||||||
 | 
					screen_num = DefaultScreen(display);
 | 
				
			||||||
 | 
					display_width = DisplayWidth(display, screen_num);
 | 
				
			||||||
 | 
					display_height = DisplayHeight(display, screen_num);
 | 
				
			||||||
 | 
					/* make the new window occupy 1/9 of the screen's size. */
 | 
				
			||||||
 | 
					width = (display_width *.9);
 | 
				
			||||||
 | 
					height = (display_height *.9);
 | 
				
			||||||
 | 
					printf("window width - '%d'; height - '%d'\n", width, height);
 | 
				
			||||||
 | 
					/* create a simple window, as a direct child of the screen's
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/* root window. Use the screen's white color as the background */
 | 
				
			||||||
 | 
					/* color of the window. Place the new window's top-left corner */
 | 
				
			||||||
 | 
					/* at the given 'x,y' coordinates.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					win = create_simple_window(display, width, height, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//create pixmap and map it as window background - trick to avoid need of treating expose events
 | 
				
			||||||
 | 
					Pixmap pixmap;
 | 
				
			||||||
 | 
					pixmap = XCreatePixmap(display, RootWindow(display, DefaultScreen(display)), width, height, DefaultDepth(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XSetWindowBackgroundPixmap(display, win, pixmap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* allocate a new GC (graphics context) for drawing in the window. */
 | 
				
			||||||
 | 
					gc = create_gc(display, pixmap);
 | 
				
			||||||
 | 
					XSetBackground(display, gc, WhitePixel(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
					XSetForeground(display, gc, WhitePixel(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
					XFillRectangle(display, pixmap, gc, 0, 0, width, height);
 | 
				
			||||||
 | 
					XSetForeground(display, gc, BlackPixel(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//display it
 | 
				
			||||||
 | 
					XFlush(display); XSync(display, False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//colors
 | 
				
			||||||
 | 
					Colormap screencolormap;
 | 
				
			||||||
 | 
					XColor mycolor;
 | 
				
			||||||
 | 
					Status rc;
 | 
				
			||||||
 | 
					screencolormap= DefaultColormap(display,DefaultScreen(display));
 | 
				
			||||||
 | 
					rc= XAllocNamedColor(display,screencolormap,"blue",&mycolor,&mycolor);
 | 
				
			||||||
 | 
					if(rc==0) fprintf(stderr,"selhal xallocnamedcolor\n");
 | 
				
			||||||
 | 
					XSetForeground(display,gc,mycolor.pixel);
 | 
				
			||||||
 | 
					XFlush(display); XSync(display, False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XSetForeground(display, gc, BlackPixel(display, DefaultScreen(display)));//vratit cernou 
 | 
				
			||||||
 | 
					//XDrawLine(display, pixmap, gc, 0, height/2, width, height/2);
 | 
				
			||||||
 | 
					//XDrawLine(display, pixmap, gc, width/2, 0, width/2, height);
 | 
				
			||||||
 | 
					//XSetForeground(display,gc,mycolor.pixel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					double xod, xdo, yod, ydo;
 | 
				
			||||||
 | 
					xod = -100; xdo=100;
 | 
				
			||||||
 | 
					yod = -100; xdo=100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LINE lines0[]= {
 | 
				
			||||||
 | 
					{{0,0,0},{0,0,5}},
 | 
				
			||||||
 | 
					{{0,5,5},{0,0,5}},
 | 
				
			||||||
 | 
					{{0,5,5},{0,5,0}},
 | 
				
			||||||
 | 
					{{0,5,0},{0,0,0}},
 | 
				
			||||||
 | 
					{{5,0,0},{5,0,5}},
 | 
				
			||||||
 | 
					{{5,5,5},{5,0,5}},
 | 
				
			||||||
 | 
					{{5,5,5},{5,5,0}},
 | 
				
			||||||
 | 
					{{5,5,0},{5,0,0}},
 | 
				
			||||||
 | 
					{{0,0,0},{5,0,0}},
 | 
				
			||||||
 | 
					{{0,0,5},{5,0,5}},
 | 
				
			||||||
 | 
					{{0,5,0},{5,5,0}},
 | 
				
			||||||
 | 
					{{0,5,5},{5,5,5}},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					NRVec<LINE> lines(lines0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mat3<double> camera_angle;
 | 
				
			||||||
 | 
					double eul[3]={40.*M_PI/180.,40.*M_PI/180.,10.*M_PI/180.};
 | 
				
			||||||
 | 
					euler2rotmat(eul,camera_angle,"xyz");
 | 
				
			||||||
 | 
					Vec3<double> camera={50,30,40};
 | 
				
			||||||
 | 
					Vec3<double> plane_to_camera={-20,-20,-20};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XSetForeground(display,gc,mycolor.pixel);
 | 
				
			||||||
 | 
					plotobject(display, pixmap, gc, width,height, lines,camera_angle,camera,plane_to_camera,xod,xdo,yod,ydo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XClearWindow(display,win); //expose the pixmap
 | 
				
			||||||
 | 
					XSetForeground(display, gc, BlackPixel(display, DefaultScreen(display)));//vratit cernou			   
 | 
				
			||||||
 | 
					XFlush(display); XSync(display, False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//prepare to receive events
 | 
				
			||||||
 | 
					XSelectInput(display, win, KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|Button1MotionMask|PointerMotionMask);
 | 
				
			||||||
 | 
					XEvent event;
 | 
				
			||||||
 | 
					int ispressed1=0;
 | 
				
			||||||
 | 
					int ispressed2=0;
 | 
				
			||||||
 | 
					int ispressed3=0;
 | 
				
			||||||
 | 
					int x,y,x0,y0;
 | 
				
			||||||
 | 
					while(1) //LOOP ....  process events 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						XNextEvent(display, &event);
 | 
				
			||||||
 | 
							switch (event.type)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								case KeyPress:
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
									char text[16];
 | 
				
			||||||
 | 
									KeySym mykey;
 | 
				
			||||||
 | 
									int n=XLookupString(&event.xkey, text,16,&mykey,0);
 | 
				
			||||||
 | 
									if(n==1&&text[0]=='q') goto done;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case ButtonPress:
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button1) ispressed1=1;			
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button2) ispressed2=1;			
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button3) ispressed3=1;			
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case MotionNotify:
 | 
				
			||||||
 | 
									x = event.xbutton.x;
 | 
				
			||||||
 | 
									y = event.xbutton.y;
 | 
				
			||||||
 | 
									if(ispressed1) 
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
										if(x0>x) eul[0]+=0.01;
 | 
				
			||||||
 | 
					                                	if(x0<x) eul[0]-=0.01;
 | 
				
			||||||
 | 
					                                	if(y0>y) eul[1]+=0.01;
 | 
				
			||||||
 | 
					                                	if(y0<y) eul[1]-=0.01;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									if(ispressed2)
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                        }
 | 
				
			||||||
 | 
									if(ispressed3)
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                        }
 | 
				
			||||||
 | 
									if(ispressed1||ispressed2||ispressed3)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
										XSetForeground(display, gc, WhitePixel(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
										XFillRectangle(display, pixmap, gc, 0, 0, width, height);
 | 
				
			||||||
 | 
										XSetForeground(display, gc, BlackPixel(display, DefaultScreen(display)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										euler2rotmat(eul,camera_angle,"xyz");
 | 
				
			||||||
 | 
										plotobject(display, pixmap, gc, width,height, lines,camera_angle,camera,plane_to_camera,xod,xdo,yod,ydo);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									x0=x;
 | 
				
			||||||
 | 
									y0=y;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case ButtonRelease:
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button1) ispressed1=0;
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button2) ispressed2=0;
 | 
				
			||||||
 | 
									if(event.xbutton.button==Button3) ispressed3=0;
 | 
				
			||||||
 | 
					                                break;
 | 
				
			||||||
 | 
								case Expose:
 | 
				
			||||||
 | 
								default: 
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
						XClearWindow(display,win); //expose the pixmap
 | 
				
			||||||
 | 
						XFlush(display); XSync(display, False);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					done:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* close the connection to the X server. */
 | 
				
			||||||
 | 
					XCloseDisplay(display);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								vec.cc
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								vec.cc
									
									
									
									
									
								
							@ -803,12 +803,6 @@ return -1;
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T>
 | 
					 | 
				
			||||||
NRVec<T>::NRVec(const std::list<T> l) : NRVec<T>(l.size())
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
int ii=0;
 | 
					 | 
				
			||||||
for(typename std::list<T>::const_iterator i=l.begin(); i!=l.end(); ++i) (*this)[ii++] = *i;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vec.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								vec.h
									
									
									
									
									
								
							@ -1945,6 +1945,17 @@ void NRVec<T>::get(int fd, bool dim, bool transp) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//constructor from a list
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					NRVec<T>::NRVec(const std::list<T> l) : NRVec<T>(l.size())
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int ii=0;
 | 
				
			||||||
 | 
					for(typename std::list<T>::const_iterator i=l.begin(); i!=l.end(); ++i) (*this)[ii++] = *i;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}//namespace
 | 
					}//namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _LA_VEC_H_ */
 | 
					#endif /* _LA_VEC_H_ */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vecmat3.cc
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								vecmat3.cc
									
									
									
									
									
								
							@ -842,12 +842,23 @@ T Mat3<T>::norm(const T scalar) const
 | 
				
			|||||||
return sqrt(sum);
 | 
					return sqrt(sum);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//cf. https://en.wikipedia.org/wiki/3D_projection
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					void perspective(T *proj_xy, const Vec3<T> &point, const Mat3<T> &camera_angle, const Vec3<T> &camera,  const Vec3<T> &plane_to_camera)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					Vec3<T> d=camera_angle*(point-camera);
 | 
				
			||||||
 | 
					T scale = plane_to_camera[2]/d[2];
 | 
				
			||||||
 | 
					for(int i=0; i<2; ++i) proj_xy[i]= scale*d[i] + plane_to_camera[i];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//force instantization
 | 
					//force instantization
 | 
				
			||||||
#define INSTANTIZE(T) \
 | 
					#define INSTANTIZE(T) \
 | 
				
			||||||
template class Vec3<T>; \
 | 
					template class Vec3<T>; \
 | 
				
			||||||
template class Mat3<T>; \
 | 
					template class Mat3<T>; \
 | 
				
			||||||
template void euler2rotmat(const T *eul, Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0); \
 | 
					template void euler2rotmat(const T *eul, Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0); \
 | 
				
			||||||
template void rotmat2euler(T *eul, const Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0); \
 | 
					template void rotmat2euler(T *eul, const Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0); \
 | 
				
			||||||
 | 
					template void  perspective(T *proj_xy, const Vec3<T> &point, const Mat3<T> &camera_angle, const Vec3<T> &camera,  const Vec3<T> &plane_to_camera); \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef AVOID_STDSTREAM
 | 
					#ifndef AVOID_STDSTREAM
 | 
				
			||||||
 | 
				
			|||||||
@ -190,6 +190,9 @@ void euler2rotmat(const T *eul, Mat3<T> &a, const char *type, bool transpose=0,
 | 
				
			|||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
void rotmat2euler(T *eul, const Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0);
 | 
					void rotmat2euler(T *eul, const Mat3<T> &a, const char *type, bool transpose=0, bool direction=0, bool reverse=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					void perspective(T *proj_xy, const Vec3<T> &point, const Mat3<T> &camera_angle, const Vec3<T> &camera,  const Vec3<T> &plane_to_camera);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}//namespace
 | 
					}//namespace
 | 
				
			||||||
#endif /* _VECMAT3_H_ */
 | 
					#endif /* _VECMAT3_H_ */
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user