• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z programowania grafiki komputerowej

Object Storage Arubacloud
–1 głos
303 wizyt
pytanie zadane 17 grudnia 2016 w C i C++ przez Wi_ktos Bywalec (2,950 p.)

Witam,

mam problem z zadaniem z programowania grafiki komputerowej czy jest jakaś chętna osóbka, która pokazałaby mi jak takie zadanie należy rozwiązać ? Oto  kod w ktorym zakomentarzowane sa dwa zadania.

 

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>
#include <math.h>

//const int cols = 1920 ;
//const int rows = 1080 ;

const int cols = 1920;
const int rows = 1080;

//Some nice part
/*
const double cx = -0.74529 ;
const double cy = 0.113075 ;
const double delta = 1.5e-4 ;

const double minx = cx - delta ;
const double maxx = cx + delta ;
const double miny = cy - delta ;
const double maxy = cy + delta ;
*/

//Default area
static double minx = -2.0;
static double maxx = 1;
static double miny = -1.0;
static double maxy = 1.0;

static unsigned char *imdata = new unsigned char[cols * rows * 3];
static int *iterdata = new int[cols * rows];
const int max_iter = 10000;

/*int round(double d)
{
	return static_cast<int>(d + 0.5);
}*/

/**
* Funkcja opracowana na podstawie:
* https://rosettacode.org/wiki/Bitmap/Write_a_PPM_file
*/
int saveImage()
{
	FILE *fp = fopen("image.ppm", "wb"); /* b - binary mode */
	fprintf(fp, "P6\n%d %d\n255\n", cols, rows);
	fwrite(imdata, 1, cols * rows * 3, fp);
	fclose(fp);
	return 1;
}


void setPixel(int col, int row, unsigned char r, unsigned char g, unsigned char b)
{
	int base = (row * cols + col) * 3;
	imdata[base] = r;
	imdata[base + 1] = g;
	imdata[base + 2] = b;
}

void setIter(int col, int row, int iter)
{
	int base = row * cols + col;
	iterdata[base] = iter;
}

int getIter(int col, int row)
{
	int base = row * cols + col;
	return iterdata[base];
}

void iter2image()
{
	//Create and zero histogram
	int *histogram = new int[max_iter + 1];
	for (int i = 0; i <= max_iter; i++)
		histogram[i] = 0;

	//Compute histogram of iteration counts
	for (int col = 0; col < cols; col++)
		for (int row = 0; row < rows; row++) {
			int iter = getIter(col, row);
			histogram[iter]++;
		}

	//Compute CDF (we have to drop first or last value)	
	histogram[0] = 0;
	for (int i = 1; i <= max_iter; i++)
		histogram[i] += histogram[i - 1];

	//Color pixels according to CDF	
	for (int col = 0; col < cols; col++)
		for (int row = 0; row < rows; row++) {
			int iter = getIter(col, row);
			double I = ((double)histogram[iter]) / histogram[max_iter];
			unsigned char r = round(255 - I * 255);

			setPixel(col, row, r, 0, 0);
		}

	//Clean-up
	delete[]histogram;
}

void image2world(int col, int row, double &x, double &y)
{
	/* Funkcja (procedura) przyjmująca współrzędne ekranu (obrazu): col i row i zwracająca przeszkalowane współrzędne w układzie "świata"
	Zadanie 1: popraw i uzupełnij kod poniższej funkcji
	Funkcja powinna spełniać poniższe wymagania:
	1. Obszar "świata" określony stałymi (minx, maxx) i (miny, maxy) powinien dokładnie wypełniać cały obszar obrazka 0..cols,0..rows
	przynajmniej wzdłuż jednej z osi
	2. Skala powinna być identyczna dla obu osi
	3. Obszar "świata" powinien być wyśrodkowany na obszarze obrazka
	4. Kierunki osi obszaru "świata" powinny być takie jak w standardowym układzie kartezjańskim
	*/
	//Tymczasowy kod

	x = col;
       y = rows - row;
}

void drawMandelbrot()
{
	/*Funkcja (procedura) rysująca zbiór Mandelbrota
	Zadanie 2: Zaprogramować funkcję rysującą zbiór Mandelbrota


	Dla każdego piksela obrazu realizujemy algorytm:
	--------------------
	Dane: x0,y0 - przeskalowane współrzędne badanego piksela (wyrażone we współrzędnych świata)
	Dane: max_iter - maksymalna liczba iteracji
	Wynik: iter - wynikowa liczba iteracji

	iter = 0
	x=0
	y=0

	Dopóki iter < max_iter i x^2+y^2<2*2
	xnowy := x^2-y^2+x0
	ynowy := 2xy + y0
	x = xnowy
	y = ynowy
	iter = iter + 1

	---------------------
	i zapamiętujemy liczbę iteracji za pomocą funkcji setIter
	(liczbę iteracji można traktować jak wartość koloru piksela)

	*/

	//Tymczasowy kod rysujący kółka

	
		for (int col = 0; col < cols; col++)
		for (int row = 0; row < rows; row++) {
			double x0, y0;
			image2world(col, row, x0, y0);
			double xc = 500;
			double yc = 500;
			int iter = round(sqrt((x0 - xc)*(x0 - xc) + (y0 - yc)*(y0 - yc)) * 100);
			iter = iter % (max_iter + 1);
			setIter(col, row, iter);
		}
}

int main()
{
	//Just testing...coordinate conversion
	double x, y;
	image2world(0, 0, x, y);
	std::cout << x << " " << y << std::endl;
	image2world(199, 99, x, y);
	std::cout << x << " " << y << std::endl;

	//drawCircles() ;
	drawMandelbrot();
	iter2image();
	saveImage();

	delete[]imdata;
	delete[]iterdata;

	return 0;
}

Z góry dziekuje

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
5 odpowiedzi 533 wizyt
pytanie zadane 7 lutego 2017 w Sprzęt komputerowy przez Ares Obywatel (1,560 p.)
+3 głosów
6 odpowiedzi 547 wizyt
pytanie zadane 11 kwietnia 2015 w Offtop przez Pyro Gaduła (4,210 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...