Bits and pieces of SolveSpace; zoom works now, and some stuff to

draw planes that I will use to do the datum planes. Still haven't
settled upon the request/entity/group structure, and that's the
dependency before doing much real.

[git-p4: depot-paths = "//depot/solvespace/": change = 1656]
solver
Jonathan Westhues 2008-04-01 02:48:44 -08:00
parent f201d52247
commit 19c6be530f
11 changed files with 182 additions and 27 deletions

View File

@ -13,6 +13,8 @@ SSOBJS = $(OBJDIR)\solvespace.obj \
$(OBJDIR)\cmdline.obj \
$(OBJDIR)\graphicswin.obj \
$(OBJDIR)\util.obj \
$(OBJDIR)\entity.obj \
$(OBJDIR)\sketch.obj \
LIBS = user32.lib gdi32.lib comctl32.lib advapi32.lib opengl32.lib glu32.lib

8
dsc.h
View File

@ -9,13 +9,19 @@ class Vector {
public:
double x, y, z;
Vector Plus(Vector b);
Vector Minus(Vector b);
Vector Negated(void);
Vector Cross(Vector b);
double Vector::Dot(Vector b);
double Dot(Vector b);
Vector Normal(int which);
Vector RotatedAbout(Vector axis, double theta);
double Magnitude(void);
Vector ScaledBy(double v);
};
void glVertex3v(Vector u);
class Point2d {
public:

32
entity.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "solvespace.h"
void Entity::Draw(void) {
int i;
for(i = 0; i < 3; i++) {
Vector p, u, v;
if(i == 0) {
p.x = 0; p.y = 0; p.z = 1;
} else if(i == 1) {
p.x = 0; p.y = 1; p.z = 0;
} else {
p.x = 1; p.y = 0; p.z = 0;
}
u = p.Normal(0);
v = p.Normal(1);
double s = (min(SS.GW.width, SS.GW.height))*0.4;
u = u.ScaledBy(s);
v = v.ScaledBy(s);
Vector r;
glBegin(GL_LINE_LOOP);
r = p; r = r.Minus(v); r = r.Minus(u); glVertex3v(r);
r = p; r = r.Plus(v); r = r.Minus(u); glVertex3v(r);
r = p; r = r.Plus(v); r = r.Plus(u); glVertex3v(r);
r = p; r = r.Minus(v); r = r.Plus(u); glVertex3v(r);
glEnd();
}
}

View File

@ -1,7 +1,4 @@
#include <stdarg.h>
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include "solvespace.h"
@ -101,7 +98,31 @@ void GraphicsWindow::MouseMiddleDown(double x, double y) {
void GraphicsWindow::MouseLeftDown(double x, double y) {
}
void GraphicsWindow::MouseScroll(double x, double y, int delta) {
double offsetRight = offset.Dot(projRight);
double offsetDown = offset.Dot(projDown);
double righti = x/scale - offsetRight;
double downi = y/scale - offsetDown;
if(delta > 0) {
scale *= 1.3;
} else {
scale /= 1.3;
}
double rightf = x/scale - offsetRight;
double downf = y/scale - offsetDown;
offset = offset.Plus(projRight.ScaledBy(rightf - righti));
offset = offset.Plus(projDown.ScaledBy(downf - downi));
Invalidate();
}
void GraphicsWindow::Paint(int w, int h) {
width = w; height = h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
@ -127,17 +148,7 @@ void GraphicsWindow::Paint(int w, int h) {
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex3f(-200, -200, 0);
glVertex3f(-200, 200, 0);
glVertex3f( 200, 200, 0);
glVertex3f( 200, -200, 0);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-200, -200, 200);
glVertex3f(-200, 200, 200);
glVertex3f( 200, 200, 200);
glVertex3f( 200, -200, 200);
glEnd();
Entity e;
e.Draw();
}

6
sketch.cpp Normal file
View File

@ -0,0 +1,6 @@
#include "solvespace.h"
const hRequest Request::HREQUEST_DATUM_PLANE_XY = { 0x00000001 };
const hRequest Request::HREQUEST_DATUM_PLANE_YZ = { 0x00000002 };
const hRequest Request::HREQUEST_DATUM_PLANE_ZX = { 0x00000003 };

View File

@ -6,6 +6,7 @@ class hEntity;
class hPoint;
class hRequest;
class hParam;
class hGroup;
class hRequest {
public:
@ -16,9 +17,11 @@ public:
class Request {
public:
static const int REQUEST_LINE_SEGMENT = 0;
static const int REQUEST_STEP_REPEAT_TRANSLATE = 1;
static const int REQUEST_STEP_REPEAT_TRANSLATE_SYM = 2;
static const hRequest HREQUEST_DATUM_PLANE_XY,
HREQUEST_DATUM_PLANE_YZ,
HREQUEST_DATUM_PLANE_ZX;
static const int FOR_PLANE = 0;
int type;
hRequest h;
@ -34,11 +37,12 @@ public:
class Entity {
public:
static const int ENTITY_LINE_SEGMENT = 0;
static const int ENTITY_PWL_SEGMENT = 1;
static const int ENTITY_PLANE = 0;
int type;
hEntity h;
void Draw(void);
};
class hPoint {

View File

@ -15,8 +15,15 @@ void SolveSpace::Init(void) {
point.Clear();
param.Clear();
// The sketch starts with three requests, for three datum planes.
Request n;
n.type = Request::FOR_PLANE;
req.AddById(&n, Request::HREQUEST_DATUM_PLANE_XY);
req.AddById(&n, Request::HREQUEST_DATUM_PLANE_YZ);
req.AddById(&n, Request::HREQUEST_DATUM_PLANE_ZX);
int i;
for(i = 0; i < 20; i++) {
for(i = 0; i < 10; i++) {
TW.Printf("this is line number %d", i);
}
}

View File

@ -17,6 +17,10 @@ void dbp(char *str, ...);
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <windows.h> // required for GL stuff
#include <gl/gl.h>
#include <gl/glu.h>
#include "dsc.h"
#include "ui.h"
#include "sketch.h"

7
ui.h
View File

@ -62,14 +62,15 @@ public:
// This table describes the top-level menus in the graphics winodw.
typedef void MenuHandler(int id);
typedef struct {
int level; // 0 == on menu bar, 1 == one level down, ...
int level; // 0 == on menu bar, 1 == one level down
char *label; // or NULL for a separator
int id; // unique ID
MenuHandler *fn;
} MenuEntry;
static const MenuEntry menu[];
// The width and height (in pixels) of the window.
double width, height;
// These parameters define the map from 2d screen coordinates to the
// coordinates of the 3d sketch points. We will use an axonometric
// projection.
@ -94,7 +95,7 @@ public:
void MouseLeftDown(double x, double y);
void MouseLeftDoubleClick(double x, double y);
void MouseMiddleDown(double x, double y);
void MouseScroll(int delta);
void MouseScroll(double x, double y, int delta);
};

View File

@ -23,6 +23,35 @@ void MakeMatrix(double *mat, double a11, double a12, double a13, double a14,
mat[15] = a44;
}
Vector Vector::Plus(Vector b) {
Vector r;
r.x = x + b.x;
r.y = y + b.y;
r.z = z + b.z;
return r;
}
Vector Vector::Minus(Vector b) {
Vector r;
r.x = x - b.x;
r.y = y - b.y;
r.z = z - b.z;
return r;
}
Vector Vector::Negated(void) {
Vector r;
r.x = -x;
r.y = -y;
r.z = -z;
return r;
}
Vector Vector::Cross(Vector b) {
Vector r;
@ -38,6 +67,42 @@ double Vector::Dot(Vector b) {
return (x*b.x + y*b.y + z*b.z);
}
Vector Vector::Normal(int which) {
Vector n;
// Arbitrarily choose one vector that's normal to us, pivoting
// appropriately.
double xa = fabs(x), ya = fabs(y), za = fabs(z);
double minc = min(min(xa, ya), za);
if(minc == xa) {
n.x = 0;
n.y = z;
n.z = -y;
} else if(minc == ya) {
n.y = 0;
n.z = x;
n.x = -z;
} else if(minc == za) {
n.z = 0;
n.x = y;
n.y = -x;
} else {
oops();
}
if(which == 0) {
// That's the vector we return.
} else if(which == 1) {
n = this->Cross(n);
} else {
oops();
}
n = n.ScaledBy(1/n.Magnitude());
return n;
}
Vector Vector::RotatedAbout(Vector axis, double theta) {
double c = cos(theta);
double s = sin(theta);
@ -72,3 +137,8 @@ Vector Vector::ScaledBy(double v) {
return r;
}
void glVertex3v(Vector u)
{
glVertex3f((GLfloat)u.x, (GLfloat)u.y, (GLfloat)u.z);
}

View File

@ -16,12 +16,16 @@
HINSTANCE Instance;
HWND TextWnd, GraphicsWnd;
HWND TextWnd;
HWND TextWndScrollBar;
int TextWndScrollPos;
int TextWndRows;
HWND GraphicsWnd;
HMENU SubMenus[100];
struct {
int x, y;
} LastMousePos;
int ClientIsSmallerBy;
@ -317,6 +321,9 @@ LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam,
x = x - (r.right - r.left)/2;
y = (r.bottom - r.top)/2 - y;
LastMousePos.x = x;
LastMousePos.y = y;
if(msg == WM_LBUTTONDOWN) {
SS.GW.MouseLeftDown(x, y);
} else if(msg == WM_MBUTTONDOWN) {
@ -333,6 +340,11 @@ LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam,
}
break;
}
case WM_MOUSEWHEEL: {
int delta = GET_WHEEL_DELTA_WPARAM(wParam);
SS.GW.MouseScroll(LastMousePos.x, LastMousePos.y, delta);
break;
}
case WM_CLOSE:
case WM_DESTROY: