generowanie 10000 punktów w przestrzeni

0

Witam :)
Polecenie jest następujące:

Napisać program w C++, obiektowo, który wygeneruje 10000 punktów w przestrzeni (nie losowo). Współrzędne punktów mają być wyliczone na podstawie funkcji z=sin(x)*sin(y).
Dziedzina funkcji dla x i y (-pi, pi).
Dla osi x ma być 100 wartości, dla osi y ma być 100 wartości - razem 10000 punktów (100 na 100 punktów).
Wartość funkcji z=sin(x)*sin(y) należy pomnożyć przez 100 (aby uzyskać wyższe wartości dla współrzędnej z).
Współrzędne punktu centralnego do wizualizacji: (500, 300, 100).
Wizualizacja wyników za pomocą programu Anaglif czyli program musi wygenerować odpowiedni plik tekstowy: dane.txt.

program anaglif w załączniku.
oto kod który napisałem:

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <fstream>
using namespace std;

int main(){
double a[100], b[100], x[10000], y[10000], z[10000];
int r, j=1;
for(int i=1; i<101; i++){
  a[i]=b[i]=-M_PI+i*2*M_PI/101;  // nadaje wartosci poszczegolnym x i y, 100 wartosci dla x i y
}                                // skoro oba naleza do tego samego przedzialu i odlegosc miedzy nimi ma byc taka sama to x[i]=y[i]
for(int i=1; i<10001; i++){      // 10000 mozliwosci wiec kazdemu x[i] odpowiada 100 odpowiednikow y[i] i odwrotnie
  r=i%100;                       // licznik dla x, dzielac jakas liczbe przez 100 jej reszta nalezy do przedzialu od 0 do 99 i jest calkowita
  if(i%100==0)                   // jezeli licznik rowna sie 0 zmieniamy jego wartosc na 100 aby skorzystac z x[100]
    r=100;
  z[i]=sin(a[r])*sin(b[j])*100;  // j nadane wczesniej decyduje o wartosci y[i]
  if(i%100==0)                   // jezeli minelismy pierwsze 100 wspolzednych
    if(j==100)                   // (musimy to sprawdzic w innym wypadku j przy nastepnej petli bedzie mialo wartosc 101)
      j=100;                     // zwiekszamy j o 1 wywolujac kolejny y[i]
    else
      j++;
  x[i]=a[r];
  y[i]=b[j];	                         
  cout << "x" << i << "=" << x[i] << " ";  // wypisuje x[i]
  cout << "y" << i << "=" << y[i] << " ";  //wypisuje y[i]
  cout << "z" << i << "=" << z[i] << endl; //wypisuje z[i]
}
cout << "Zapis danych do pliku " <<endl;
ofstream plik_zapis("dane.txt");
plik_zapis << 10001 <<endl;
plik_zapis << "500 300 100" <<endl;  // punkt centralny do wizualizacji
   for(int i=1; i<10001; i++)
       plik_zapis << x[i] << " " << y[i] << " " << z[i] << endl; // zapis 10000 punktow zaleznych od i
plik_zapis <<"0"<<endl;
plik_zapis.close();
getchar();
return 0;
}

Sprawdzi ktoś czy to jest poprawne? i pytanie czemu w pliku dane.txt zmienna x[10000] ma inna wartość niż zmienna zapisana w programie którym napisałem? :) Na razie napisałem strukturalnie i nie wiem czy jest sens przekształcania tego na obiektowy :p
Pozdrawiam :)

0

POPRAWKA KODY POWYŻEJ:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <fstream>
using namespace std;

int main(){
double a[100], b[100], x[10000], y[10000], z[10000];
int r, j=-1;
for(int i=0; i<100; i++){
  a[i]=b[i]=-M_PI+(i+1)*2*M_PI/101;  // nadaje wartosci poszczegolnym x i y, 100 wartosci dla x i y
}                                // skoro oba naleza do tego samego przedzialu i odlegosc miedzy nimi ma byc taka sama to x[i]=y[i]
for(int i=0; i<10000; i++){      // 10000 mozliwosci wiec kazdemu x[i] odpowiada 100 odpowiednikow y[i] i odwrotnie
  r=i%100;                       // licznik dla x, dzielac jakas liczbe przez 100 jej reszta nalezy do przedzialu od 0 do 99 i jest calkowita
  if(i%100==0)                   // jezeli minelismy pierwsze 100 wspolzednych
    j++;                         // korzystamy z kolejnego y[i]
  z[i]=sin(a[r])*sin(b[j])*100;  // j nadane wczesniej decyduje o wartosci y[i]
 
  x[i]=a[r];
  y[i]=b[j];	                         
  cout << "x" << i+1 << "=" << x[i] << " ";  // wypisuje x[i]
  cout << "y" << i+1 << "=" << y[i] << " ";  //wypisuje y[i]
  cout << "z" << i+1 << "=" << z[i] << endl; //wypisuje z[i]
  cout << j;
}
cout << "Zapis danych do pliku " <<endl;
ofstream plik_zapis("dane.txt");
plik_zapis << 10001 <<endl;
plik_zapis << "500 300 100" <<endl;  // punkt centralny do wizualizacji
   for(int i=0; i<10000; i++)
       plik_zapis << x[i] << " " << y[i] << " " << z[i] << endl; // zapis 10000 punktow zaleznych od i
plik_zapis <<"0"<<endl;
plik_zapis.close();
getchar();
return 0;
}

 

teraz dobrze?

1

po kiego ci a[] i b[] wystarczy jednej.
z[i]=sin(a[r])*sin(a[j])*100;
a nawet żadnej nie potrzebujesz bo nie ma co przyjmować się zbędnym mnożeniem kiedy liczysz dwa sinusy.

tablice x[],y[],z[] - po kiego?
pisz od razu do pliku po wyliczeniach, ewentualnie na ekran też:

const double mul=2*M_PI/101;
ofstream plik_zapis("dane.txt");
plik_zapis<<10001<<endl;
plik_zapis<<"500 300 100"<<endl;
for(int y=1,i=1;y<=100;++y)
  {
   for(int x=1;x<=100;++x,++i)
     {
      double X=x*mul-M_PI,Y=y*mul-M_PI,Z=(sin(X)*sin(Y)*100);
      cout<<"x["<<i<<"]="<<X<<"; y["<<i<<"]="<<Y<<"; z["<<i<<"]="<<Z<<';'<<endl;
      plik_zapis<<X<<' '<<Y<<' '<<Z<<endl;
     }
  }
plik_zapis<<"0"<<endl;
plik_zapis.close();

i to jest całość!

0

a kiedy ktos zrobi to ale obiektowo?

0

Mam do napisania program w c++ obiektowo aby obliczal wielomian ktory trzeba wprowadzic i pochodna z niego np. 2x3+4x2+3x a pochodna 6x2+8x+3.
ktos pomoze?

0

Chcialbym aby ktos to zrobil za opłata :)

0

Rób większe wcięcia, np. 4 spacje. Dwie wyglądają dobrze w Pascalu, ale w językach z klamerkami jest to raczej za mało.

0
kukus napisał(a):

Chcialbym aby ktos to zrobil za opłata :)
No to zgłoś się do mnie, obgadamy temat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1