/* Public domain */ /* * This program uses FreeSG to display a 3D plot of (a subset of) all * linear combinations of 3 arbitrary vectors. */ #include #include #include #include #include #include #include static M_Real step = 0.25; static M_Real c1 = -5.0, c2 = 5.0; static M_Real d1 = -5.0, d2 = 5.0; static M_Real e1 = -5.0, e2 = 5.0; static M_Vector3 u = { 1.0, 0.0, 0.0 }; static M_Vector3 v = { 0.0, 1.0, 0.0 }; static M_Vector3 w = { 0.0, 0.0, 1.0 }; SG_NodeClass LinearPlotClass; static void LinearDraw(void *p, SG_View *view) { SG *sg = view->sg; SG_Node *node = p; M_Real c, d, e; M_Vector3 up, vp, wp; GL_Begin(GL_POINTS); for (c = c1; c < c2; c += step) { up = M_VecScale3(u, c); GL_Vertex3v(&up); GL_Color3(M_ColorRGB(c/c2, d/d2, e/e2)); for (d = d1; d < d2; d += step) { vp = M_VecScale3(v, d); vp = M_VecAdd3(vp, up); GL_Color3(M_ColorRGB(c/c2, d/d2, e/e2)); GL_Vertex3v(&vp); for (e = e1; e < e2; e += step) { wp = M_VecScale3(w, e); wp = M_VecAdd3(wp, up); wp = M_VecAdd3(wp, vp); GL_Color3(M_ColorRGB(c/c2, d/d2, e/e2)); GL_Vertex3v(&wp); } } } GL_End(); } AG_Window * CreateParameterWindow(void) { AG_Window *win; AG_Numerical *num; AG_HBox *hb; win = AG_WindowNew(0); AG_WindowSetCaptionS(win, "Parameters"); AG_WindowSetPosition(win, AG_WINDOW_MIDDLE_LEFT, 0); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "c1: ", &c1); M_NumericalNewReal(hb, 0, NULL, "c2: ", &c2); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "d1: ", &d1); M_NumericalNewReal(hb, 0, NULL, "d2: ", &d2); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "e1: ", &e1); M_NumericalNewReal(hb, 0, NULL, "e2: ", &e2); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "u1: ", &u.x); M_NumericalNewReal(hb, 0, NULL, "u2: ", &u.y); M_NumericalNewReal(hb, 0, NULL, "u3: ", &u.z); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "v1: ", &v.x); M_NumericalNewReal(hb, 0, NULL, "v2: ", &v.y); M_NumericalNewReal(hb, 0, NULL, "v3: ", &v.z); hb = AG_HBoxNew(win, AG_HBOX_HOMOGENOUS); M_NumericalNewReal(hb, 0, NULL, "w1: ", &w.x); M_NumericalNewReal(hb, 0, NULL, "w2: ", &w.y); M_NumericalNewReal(hb, 0, NULL, "w3: ", &w.z); num = M_NumericalNewReal(hb, 0, NULL, "step: ", &step); AG_NumericalSetIncrement(num, 0.01); AG_WindowShow(win); } int main(int argc, char *argv[]) { AG_Window *win; SG_View *sv; SG_Node *plot; SG *sg; if (AG_InitCore("linear-demo", 0) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (1); } if (AG_InitGraphics("") == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (-1); } SG_InitSubsystem(); AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_Quit); AG_BindGlobalKey(AG_KEY_F8, AG_KEYMOD_ANY, AG_ViewCapture); agColors[WINDOW_BG_COLOR] = AG_ColorRGB(0,0,0); CreateParameterWindow(); /* Create the scene. */ sg = SG_New(NULL, "MyScene", 0); /* Create an instance of our plot object. */ AG_RegisterClass(&LinearPlotClass); plot = AG_Malloc(sizeof(SG_Node)); AG_ObjectInit(plot, &LinearPlotClass); AG_ObjectSetName(plot, "MyLinearPlot"); AG_ObjectAttach(sg->root, plot); /* Create a window with a SG_View. Disable lighting. */ win = AG_WindowNew(0); AG_WindowSetCaptionS(win, "Linear combinations"); sv = SG_ViewNew(win, sg, SG_VIEW_EXPAND|SG_VIEW_NO_LIGHTING); AG_WindowSetGeometryAlignedPct(win, AG_WINDOW_MC, 50, 50); AG_WindowShow(win); /* Reposition the default camera. */ SG_Translate(sv->cam, 0.0, 0.0, -20.0); SG_Rotatevd(sv->cam, 180.0, M_VecI3()); AG_EventLoop(); AG_Destroy(); return (0); } /* Define a new node class for our plot. */ SG_NodeClass LinearPlotClass = { { "SG_Node:LinearPlot", sizeof(SG_Node), { 0,0 }, NULL, /* init */ NULL, /* destroy */ NULL, /* load */ NULL, /* save */ NULL, /* edit */ }, NULL, /* menuInstance */ NULL, /* menuClass */ LinearDraw, NULL /* edit */ };