/**********************************************************/

/*  Program liczy rozkîad potencjaîu (np. grawitacyjnego) */

/*      Napisane dla Magazynu Amiga   (c) 1995 by BsZ     */

/**********************************************************/

#include <ctype.h>

#include <fctype.h>

#include <functions.h>

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <exec/types.h>

#include <intuition/intuition.h>

#include <time.h>

#define DEPTH 4

#define COLORS 16

#define WIDTH 640

#define HEIGHT 512

#define N_MAX 1000	/* maksymalna iloôę punktów */

struct Screen *scr;

struct IntuitionBase *IntuitionBase;

struct GfxBase *GfxBase;

struct NewScreen scr_data={

	0,0,WIDTH,HEIGHT,DEPTH,1,1,HIRES|LACE,CUSTOMSCREEN,0,

	(UBYTE *)"Pole",0,0};

int N,X,Y,x[N_MAX],y[N_MAX],m[N_MAX];

float BRIGHT;

void niedobrze(void)

{

	if (scr) CloseScreen(scr);

	if (GfxBase) CloseLibrary((struct Library *)GfxBase);

	if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);

	exit(0);

}

float RND(void)

{

	return (float)(rand()/(float)RAND_MAX);

}

void losuj(void)

{

	int licznik;

	long int t;



	time(&t);

	srand((UWORD)t);

	for(licznik=0;licznik<N;licznik++)

	{

		x[licznik]=(int)(RND()*639+1);

		y[licznik]=(int)(RND()*511+1);

		m[licznik]=(int)(RND()*29+1);

	}

}

void OpenAllLibraries(void)

{

	IntuitionBase=(struct IntuitionBase *)OldOpenLibrary("intuition.library");

	if (!IntuitionBase) exit(100);

	GfxBase=(struct GfxBase *)OldOpenLibrary("graphics.library");

	if (!GfxBase) exit(100);

}

void paleta(void)

{

	ULONG i;

	for(i=0;i<COLORS;i++)

		SetRGB4(&scr->ViewPort, i, i, i, i);

}

int kolor(float c)

{

	if(BRIGHT*c>15.0)

		return 15;

	else

		return (int)(BRIGHT*c);

}

float v(int index)

{

	float r;

	if( (x[index]==X) && (y[index]==Y) ) return 1000.0; /* biaîy */

	r=(float)(sqrt( (double)( (x[index]-X)*(x[index]-X)+(y[index]-Y)*(y[index]-Y))));

	return( (float)(m[index]/r) );

} /* v() */

void main()

{

	int i;

	float tempv;

	printf("Podaj iloôę punktów ");

	scanf("%d",&N);

	printf("Podaj jasnoôę ");

	scanf("%f",&BRIGHT);

	losuj();

	OpenAllLibraries();

	if(!(scr=OpenScreen(&scr_data))) niedobrze();

	paleta();

	SetRast(&scr->RastPort,0);

	for(Y=1;Y<=HEIGHT;Y++)

	{

		if(scr->MouseX<5 && scr->MouseY<5)

		{

			niedobrze();

			break;

		}

		for(X=1;X<=WIDTH;X++)

		{

			tempv=0.0;

			for(i=0;i<N;i++)

				tempv+=v(i);

			SetAPen(&scr->RastPort,kolor(tempv));

			WritePixel(&scr->RastPort,X,Y);

		}

	}

	for(;;)

	{

		if(scr->MouseX<5 && scr->MouseY<5)

		{

			niedobrze();

			break;

		}

	}

}


