Я пытаюсь нарисовать 9-точечный круг для моего проекта класса openGL, проблема? Мой учитель не учил нас, как делать что-то с кругами. Он дал нам код о том, как «нарисовать» треугольник и сказал нам, что формула для поиска вершин и центральных точек для обычных кругов. Но ни разу даже не затронул вопрос о том, как использовать их для кодирования, тем более, что он хочет, чтобы мы это делали. Он сказал нам, чтобы использоватьНарисуйте круг 9 точек в openGL?
class GLintPoint {
public:
GLint x, y;
};
и мы могли бы назвать их А, В, С, затем найти вершину сказать = B - A. Я предполагаю, что это будет ах = Bx - Ax и та же, почему, но я не знаю точно. Ему пришлось уйти на медицинскую штуку (я предполагаю операцию), поэтому я не могу его спросить, и у него все еще есть это в конце недели.
Он дал нам этот код, прежде чем он ушел.
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include "canvas.h"
const int screenWidth = 640;
const int screenHeight = 480;
Canvas cvs(screenWidth, screenHeight, "Relative Drawing Example", 1);
class GLintPoint {
public:
GLint x, y;
};
#define NUM 3
static GLintPoint List[NUM];
// myInit
void myInit(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)screenWidth, 0.0, (GLdouble)screenHeight);
}
// myDisplay
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
void mykey(unsigned char key, int x, int y)
{
if (key == 'Q' || key == 'q') exit(0);
}
// draw arc
void draw_arc(GLdouble cx, GLdouble cy, GLdouble r, GLdouble startAngle,
GLdouble sweepAngle)
{
glBegin(GL_LINE_STRIP);
for (GLdouble t = startAngle; t < startAngle+sweepAngle; t += 0.001)
{
GLdouble x = cx + r*cos(DEG2RAD*t);
GLdouble y = cy + r*sin(DEG2RAD*t);
glVertex2d(x, y);
}
glEnd();
}
// myMouse
void myMouse(int button, int state, int x, int y)
{
static int last = -1;
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && last < (NUM -1))
{
List[++last].x = x;
List[ last].y = screenHeight - y;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= last; i++) {
if(last <=0){
cvs.moveTo(List[i].x, List[i].y);
}
else
cvs.lineTo(List[i].x, List[i].y);
}
int i = 0;
cvs.lineTo(List[i].x, List[i].y);
glEnd();
glFlush();
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
last = -1;
GLintPoint a.x =
}
// main
int main(int argc, char ** argv)
{
//glutInit(&argc, argv);
//glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);
//glutInitWindowSize(screenWidth, screenHeight);
//glutInitWindowPosition(100, 150);
//glutCreateWindow("case study 4.2");
glutDisplayFunc(myDisplay);
glutMouseFunc(myMouse);
glutKeyboardFunc(mykey);
myInit();
glutMainLoop();
return 0;
}
и
#include <math.h>
// define some ascii key names
#define GLUT_KEY_ESC 27
// Keeps track of a single point (turtle position)
class Point2d {
public:
Point2d() { x = y = 0.0f; }
Point2d(float xx, float yy) { x = xx; y = yy; }
void set(float xx, float yy) { x = xx; y = yy; }
void setX(float xx) { x = xx; }
void setY(float yy) { y = yy; }
float getX() { return x; }
float getY() { return y; }
void draw(void) { glBegin(GL_POINTS);
glVertex2f((GLfloat)x, (GLfloat)y);
glEnd();
}
private:
float x, y;
};
//Data type for an array of points
class Point2dArray {
static const int MAX_NUM = 100;
public:
int num;
Point2d pt[MAX_NUM];
};
class IntRect {
public:
IntRect() { l = 0; r = 100; b = 0; t = 100; }
IntRect(int left, int right, int bottom, int top)
{ l = left; r = right; b = bottom; t = top; }
void set(int left, int right, int bottom, int top)
{ l = left; r = right; b = bottom; t = top; }
void draw(void) { glRecti(l, b, r, t); }
int getL() { return l; }
int getR() { return r; }
int getT() { return t; }
int getB() { return b; }
private:
int l, r, b, t;
};
class RealRect {
public:
RealRect() { l = 0; r = 100; b = 0; t = 100; }
RealRect(float left, float right, float bottom, float top)
{ l = left; r = right; b = bottom; t = top; }
void set(float left, float right, float bottom, float top)
{ l = left; r = right; b = bottom; t = top; }
void draw(void) { glRectf(l, b, r, t); }
float ratio(void) { return (r - l)/(t - b); }
float getL() { return l; }
float getR() { return r; }
float getT() { return t; }
float getB() { return b; }
private:
float l, r, b, t;
};
class Canvas {
public:
Canvas(int width, int height, char* windowTitle, int buffer);
void setWindow(float l, float r, float b, float t);
void setViewport(int w, int h);
void autoSetWindow(void);
float getWindowAspectRatio(void);
void lineTo(float x, float y);
void lineTo(Point2d p);
void moveTo(float x, float y);
void moveTo(Point2d p);
void turnTo(float angle);
void turn(float angle);
void forward(float dist, int visible);
int getWinId(void);
void initCT(void);
void scale2D(double, double);
void translate2D(double, double);
void rotate2D(double);
private:
Point2d CP;
float CD;
IntRect viewport;
RealRect window;
int winId;
float delx, dely;
char code1, code2;
char formCode(Point2d p);
void chopLine(Point2d &p, char c);
int clipSegment(Point2d &p1, Point2d &p2);
};
Canvas::Canvas(int width, int height, char* windowTitle, int buffer = 1) {
char* argv[1];
char dummyString[1];
argv[0] = dummyString;
int argc = 1;
glutInit(&argc, argv);
glutInitDisplayMode(((buffer == 1) ? GLUT_SINGLE : GLUT_DOUBLE) | GLUT_RGB);
glutInitWindowSize(width, height);
glutInitWindowPosition((1024 - width)/2, (768 - height)/2);
winId = glutCreateWindow(windowTitle);
setWindow(1000.0f, -1000.0f, 1000.0f, -1000.0f);
CP.set(0.0f, 0.0f);
CD = 0.0f;
}
int Canvas::getWinId(void)
{
return winId;
}
float Canvas::getWindowAspectRatio(void)
{
return (window.getR() - window.getL())/(window.getT() - window.getB());
}
void Canvas::setWindow(float l, float r, float b, float t) {
window.set(l, r, b, t);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D((GLdouble) l, (GLdouble) r, (GLdouble) b, (GLdouble) t);
}
void Canvas::autoSetWindow(void) {
float l = window.getL();
float r = window.getR();
float b = window.getB();
float t = window.getT();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D((GLdouble) l, (GLdouble) r, (GLdouble) b, (GLdouble) t);
}
void Canvas::setViewport(GLsizei width, GLsizei height) {
float aspectRatio = getWindowAspectRatio();
GLint l, b;
GLsizei w, h;
if ((float) width/(float) height >= aspectRatio) {
l = (GLint) ((width - height * aspectRatio)/2.0);
b = 0;
w = (GLsizei) (height * aspectRatio);
h = height;
}
else {
l = 0;
b = (int) ((height - width/aspectRatio)/2.0);
w = width;
h = (GLsizei) (width/aspectRatio);
}
glViewport(l, b, w, h);
}
void Canvas::lineTo(float x, float y) {
glBegin(GL_LINES);
glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
glVertex2f((GLfloat) x, (GLfloat) y);
glEnd();
CP.set(x, y);
glFlush();
}
void Canvas::lineTo(Point2d p) {
glBegin(GL_LINES);
glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
glEnd();
CP.set(p.getX(), p.getY());
glFlush();
}
void Canvas::moveTo(float x, float y) {
CP.set(x, y);
}
void Canvas::moveTo(Point2d p) {
CP.set(p.getX(), p.getY());
}
void Canvas::turn(float angle) {
CD += angle;
}
void Canvas::turnTo(float angle) {
CD = angle;
}
void Canvas::forward(float dist, int visible) {
const float RadPerDeg=0.017453393;
float x = CP.getX()+dist*cos(RadPerDeg*CD);
float y = CP.getY()+dist*sin(RadPerDeg*CD);
float l = window.getL();
float r = window.getR();
float b = window.getB();
float t = window.getT();
l = (x < l)?x:l;
r = (x > r)?x:r;
b = (y < b)?y:b;
t = (y > t)?y:t;
window.set(l, r, b, t);
if (visible)
lineTo(x, y);
else
moveTo(x, y);
}
И эти формулы. Письменное так же, как листок бумаги, он дал мне читает а = B-A B = C - B C - A - C
c = A = 1/2((a + ((b(dot product) c)/(matrix of a (dotproduct)c)) * (matrix of a))
r = (magnitude of a)/2 squareroot(((b(dot product) c)/(matrix of a (dotproduct)c))^2 + 1)
Я ненавижу, чтобы спросить, но я знаю, когда я в течение моя голова, может ли кто-нибудь сделать головы или хвосты того, что ГЭС просит меня сделать? Или может ли кто-нибудь привести меня в правильном направлении, как сделать 9-очковый круг? Его стоит 10% от моего окончательного уровня, поэтому я не прошу код просто скопировать/вставить только «wtf do do do?» это все, что я прошу.
Это не 9-точечный круг, а многоугольник с 9 вершинами? – deepmax