الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الي يعرف عن الbezier Curve

بدأه Nassobe في 16 ديسمبر 2009 · 1 رد · 982 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

المطلوب من البرنامج انه يرسملي الbezier curve

بعد ما اضغط بالماوس وارسم نقاط يتوصل بينهم بي خط بعدين البرنامج يرسملي المنحنى الي بين هالنقاط

صورة توضييحية مع المرفقات

بالنسبة ليا انا عرفت كيف اضبط البرنامج على 3 نقاط بس...ولكن المطلوب مني هوا ان اضبط البرنامج على س من النقاط حدها الاقصى 20 يعني ممكن ان النقاط اتكون 4 ممكن 5 وممكن 20 حتى

المشكلة في القانون نفسه للbernestain

هدا هوا القانون الي يرسملي المنحنى لو كان عندي تلاتة نقاط بس(a,b,c):

( pow((1- t),2)*a.getX() + 2*t * (1- t)* b.getX() + pow(t,2)*c.getX()); للx

( pow((1- t),2)*a.getY() + 2*t * (1- t)* b.getY() + pow(t,2)*c.getY()) ;للy

في اخطاء في السينتاكس نفسها

سامحوني لان الكود طويل شوية لكن اختكم يأست..والكود مرفق في ملف

او هدا هوا هني بس مش مرتب

شكرا مقدماً

#include<gl/glut.h>
#include<math.h>
#include<iostream.h>
#include <windows.h>

const int maxSize = 20;
int screenHeight=480;
static int numCorners = 0; // initial value is 0

class Point2 //single point w/ floating point coordinates
{
public:
	Point2() {x = y = 0.0f;} //constructor 1
	Point2(float xx, float yy ) {x=xx; y=yy; } //constructor 2
	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); //draw this point
			glVertex2f((GLfloat)x, (GLfloat)y); //type casting from float to glfloat..the different between them is system dependand
		glEnd();
	}
private:
	float x, y;
};

Point2 pt2[maxSize];

void drawDot(int x, int y){


glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();

}

void drawLine(Point2 a, Point2 b){

glBegin(GL_LINES);
glVertex2i(a.getX(),a.getY());
glVertex2i(b.getX(),b.getY());
glEnd();
glFlush();

}




Point2 bezCurve(float t,Point2 a[] ){
 //compute a point on the cuve with a value of t

 for(int i=0;i<=numCorners;i++){
 for(int j=0;j<numCorners-i;j++){
 a[j]=a[j]*(1-t)+a[j+1]*t;

 }
 return a;
 }

 // Point2 pt;
 //pt.setX ( pow((1- t),2)*a.getX() + 2*t * (1- t)* b.getX() + pow(t,2)*c.getX());

 //pt.setY ( pow((1- t),2)*a.getY() + 2*t * (1- t)* b.getY() + pow(t,2)*c.getY()) ;
 // return a[];

}







void myMouse(int button, int state, int x, int y) {



if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{

pt2[numCorners].setX((float)x);
pt2[numCorners].setY((float)( screenHeight-y));

numCorners++; // have another point

drawDot(x, screenHeight-y);
 glutPostRedisplay();
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)

glClear(GL_COLOR_BUFFER_BIT); // clear the window


glFlush();
}


void myDisplay(){
 if(numCorners == maxSize){

 glColor3f(rand()/32767.0,rand()/32767.0,rand()/32767.0);

 for(int i=0;i<numCorners;i++){
 drawLine(pt2,pt2[i+1]);
 }
//drawLine(pt2[0],pt2[1]);
//drawLine(pt2[1],pt2[2]);
Point2 firstPoint=pt2[0];

for(float t=0.0;t<= 1.0; t+=0.1){

Point2 P ;
P= bezCurve(t,pt2);
drawLine(firstPoint, P);
firstPoint=P;

}
numCorners = 0; // back to 0 corners

}

 }

int main(int argc, char **argv)
{

 	glutInit(&argc, argv);
 	glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB );

 	glutInitWindowPosition(100,100);
 	glutInitWindowSize(640,480);
 	glutCreateWindow ("Draw Bezier Curve");
 	gluOrtho2D(0,640,0,480);
 	glClearColor(0.9, 0.9, 1.0, 0.0);
 glPointSize(4.0);
 glutDisplayFunc(myDisplay);
 glutMouseFunc(myMouse);
 glutMainLoop();
 return 0;
}

2BZCurves.cpp

تم تعديل هذه المشاركة بواسطة الشمري في 16 ديسمبر 2009 في 23:02 — السبب: تعديل تنسيق الموضوع

#2

تم نقل الموضوع الى قسم برمجة الالعاب والرسوميات العام ، حيث أن الموضوع يعتمد على خوارزمية رسم ، ومكانها هنا .

بالنسبة للجواب ، لا اعرف .. قد يساعدك أحد الاخوة ان شاء الله .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة