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

قراءة ملف ب c++

بدأه hbate_allah في 24 نوفمبر 2009 · 1 رد · 535 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي ملف من نوع خاص و اريد قراءته

الملف مبدئيا هكذا

v 0.0 0.0 0.0

v 0.0 0.0 1.0

v 0.0 1.0 0.0

v 0.0 1.0 1.0

v 1.0 0.0 0.0

v 1.0 0.0 1.0

v 1.0 1.0 0.0

v 1.0 1.0 1.0

vn 0.0 0.0 1.0

vn 0.0 0.0 -1.0

vn 0.0 1.0 0.0

vn 0.0 -1.0 0.0

vn 1.0 0.0 0.0

vn -1.0 0.0 0.0

f 1//2 7//2 5//2

f 1//2 3//2 7//2

f 1//6 4//6 3//6

f 1//6 2//6 4//6

f 3//3 8//3 7//3

f 3//3 4//3 8//3

f 5//5 7//5 8//5

f 5//5 8//5 6//5

f 1//4 5//4 6//4

f 1//4 6//4 2//4

f 2//1 6//1 8//1

f 2//1 8//1 4//1

بحيث

v وهى vertexs للمجسم

vn وهى normal vertexs

البيانات التى تبدأ بحرف f هى سطوح المجسم والتى تكون على هيئة مثلثات فى الغالب

طيب والعلامه // تشير الى ان ما على يسارها vertex وما على يمينها normal vertex

مهمة normal

يعتبر المتجه العمودى هو الاساس لتحديد الظاهر و الخفى. كذلك للقيام بالاسقاط الهندسى بشكل مناسب و اخيراً التعامل مع الأضاءة.

انا اريد ان اقراه لانني اريد ان استعمله فيما بعد لرسم المجسم

هاهو الكود

#include <stdlib.h>

#include <stdio.h>

#include <iostream>

struct Triangle {

int v1;

int v2;

int v3;

};

struct Vertex {

float x;

float y;

float z;

};

using namespace std;

static void display(void)

{

// move the view a lil down so we could get the tree.obj in the centre of screen

glTranslatef(0.0, -0.50, 0.0);

// clear all pixels

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);

Vertex v[50000];

Triangle t[50000];

int vertexCount = 0;

int triangleCount = 0;

char line[100];

FILE *fp = fopen("cube.obj","r");

if (fp != NULL)

{

while (fgets(line, 99, fp))

{

if (line[0] == 'v')

{

sscanf(line, "%*c %f %f %f", &v[vertexCount].x, &v[vertexCount].y, &v[vertexCount].z);

vertexCount++;

}

else if (line[0] == 'f')

{

sscanf(line, "%*c %d %d %d", &t[triangleCount].v1, &t[triangleCount].v2, &t[triangleCount].v3);

triangleCount++;

}

}

}

fclose(fp); traingle اضفتها لانني ان اردت ان ارسم مجسم اقسمه على شكل مثلثات

لكن العمل بالجداول غير منطقي لان الملف لا نعرف كم فيه من vertex لذا قررت التبديل و العمل ب vector

اي

vector<Vertex> v;

vector<Triangle> t;لكنني لم اعرف كيف ابدل

v[vertexCount].xاي كيف اضيف في الجدول الديناميكي

ارجو ان تكونوا قد فهمتم طريقتي و فهمتم ماذا يوجد في الملف و التعقيد الذي فيه لانني لا اعرف كم v توجد

#2

السلام عليكم

هذا الملف ليس ككل الملفات التي تكون قراءتها سهلة لانه في نظري معقد نوعا ما

و الشرح الذي شرحته هو جزء فقط من تعقيده لانه اعقد من هذا

ارجو ان اجد من يساعدني لانني توصلت الى تبديل الجدول ب dynamique table


vector<Triangle> t; // added code
char line[100];
FILE *fp = fopen("cube.obj","r");
if (fp != NULL)
{
Vertex tempV;
Triangle tempT;
while (fgets(line, 99, fp))
{
if (line[0] == 'v')
{
sscanf(line, "%*c %f %f %f", &tempV.x, &tempV.y, &tempV.z); // modified code
//vertexCount++; // deleted code
v.push_back(tempV); // added code
}
else if (line[0] == 'f')
{
sscanf(line, "%*c %d %d %d", &tempT.v1, &tempT.v2, &tempT.v3); // modified code
//triangleCount++; // deleted code
t.push_back(tempT); // added code
}
}

}

fclose(fp);
....
vector<Vertex> v;	// added code

لكن

f v1[/vt1][/vn1] v2[/vt2][/vn2] v3[/vt3][/vn3]..

فمن ملف لاخر او من g لاخرى في نفس الملف يختلف تمثيلها فقد تكون بها 3 نقاط و قد عالجت هذه الحالة ب triangle لكن ان كانت اربع لم اعالجه او خمس نقاط اي على سكل خماسي لم اعرف كيف يمكنني ان اعرف من البداية هذا

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