• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Sprichwörter und Redewendungen sind das Thema unseres Monatswettbewerbes. Nähere Informationen dazu gibt es natürlich auch, und zwar auf dieser Seite ---> Klick

brauche Tipps und Tricks zum NSView

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
Code:
-(void)drawRect:(id)sender{
	int Farbtiefe;
	Farbtiefe=100;
	float reC,imC,reZ,imZ,reZ_minus1,imZ_minus1,zelle,i;
	float reZo,imZo; // Julia-Menge
	zelle=0.0027; // Apfelmännchen=0.00425, Julia-Menge=0.0027
	reC=-0.8; // Julia-Menge
	imC=0.2; // Apfelmännchen=-2.10375, Julia-Menge=0.2
	imZo=-1.3365; // Julia-Menge -1.3365
	for(int y=0; y<=980;y++){ //980
		reZo=-1.971; // Apfelmänchen reC=-3.1025; Julia-Menge reZo=-1.971;
		for(int x=0; x<=1560;x++){ //1560
			reZ_minus1=reZo; // Julia-Menge
			imZ_minus1=imZo; // Julia-Menge
			//reZ_minus1=0; // Apfelmännchen
			//imZ_minus1=0; // Apfelmännchen
			for(i=0;i<=Farbtiefe;i++){
				imZ=2*reZ_minus1*imZ_minus1+imC;
				reZ=reZ_minus1*reZ_minus1-imZ_minus1*imZ_minus1+reC;
				if(reZ*reZ+imZ*imZ>4){
					break;
				}
				reZ_minus1=reZ;
				imZ_minus1=imZ;
			}
			NSBezierPath * path=[NSBezierPath bezierPath];
			NSPoint startPoint={x,y};
			NSPoint endPoint={x+1,y};
			[path moveToPoint: startPoint];
			[path lineToPoint: endPoint];
			[[NSColor colorWithDeviceRed:i/Farbtiefe green:i/Farbtiefe blue:i/Farbtiefe alpha:1.0] set];
			[path stroke];
			reZo=reZo+zelle; // Apfelmännchen reC=reC+zelle; Julia-Menge reZo=reZo+zelle;
		}
		imZo=imZo+zelle; // Apfelmännchen imC=imC+zelle; Julia-Menge imZo=imZo+zelle;
	}
}

erste Frage:
wie kann cih anstatt Linien zu zeichnen direkt irgendwelche Punkte einfärben?
zweite Fabre: wie soll ich die NSView-Methoden im gesamten Programm anordnen, damit mein RAM nicht permanent überladen wird?
dritte Frage:
was muss ich machen, damit diese Methode nciht immer ausgeführt wird, wenn das Programm gestartet wird, ich das FEnster bewege oder nur einmal auf den Imhalt klicke?

Danke
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
erste Frage:
wie kann cih anstatt Linien zu zeichnen direkt irgendwelche Punkte einfärben?
In NSView nicht. NSView kennt keine Pixel. Wenn Du mit Pixeln arbeiten willst, dann schau Dir die Klasse NSBitmapImageRep an.

zweite Fabre: wie soll ich die NSView-Methoden im gesamten Programm anordnen, damit mein RAM nicht permanent überladen wird?
Die Frage verstehe ich nicht. NSView-Methoden gehören zu Klasse NSView. Du oder das System schickt Nachrichten an NSView-Instanzen, die dann das Ausführen der entsprechenden Methoden bewirken. Wieviel RAM Dein Programm braucht, hängt davon ab, wie viele und was für welche Objekte Du erzeugst.

dritte Frage:
was muss ich machen, damit diese Methode nciht immer ausgeführt wird, wenn das Programm gestartet wird, ich das FEnster bewege oder nur einmal auf den Imhalt klicke?
drawRect: wird immer dann aufgerufen, wenn das System festgestellt hat, dass der View neu gezeichnet werden muss. Du kannst auch dem System mitteilen, dass ein View neu gezeichnet werden muss.

Du solltest Dich aber erst einmal mit den Konzepten von Cocoa vertraut machen. Ich glaube, Du gehst einfach davon aus, dass Cocoa genauso funktioniert, wie Delphi. Dem ist nicht so! Wenn Du Cocoa genauso programmieren willst, wie Delphi, wird da nie was Vernünftiges heraus kommen, weil die Konzepte einfach unterschiedlich sind.

MacApple
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
1)
Die Kooridnatenadressierung kennt keine Punkte, oder besser gesagt: kennt nur Punkte, aber keine Pixel. Daher sind die entsprechenden Koordinaten auch in float gehalten. Du kannst ja auch keine Ausdehnung des Punktes [3,567|23,127] in einem kartesischem Koordinatensystem angeben. Sie beträgt 0.

Du musst also entweder Rechtecke zeichnen oder Images/Bit-Maps nehmen. Ich würde zum ersteren tendieren.

2)
Was willst du anordnen? Und was heißt anordnen?

3) Du kannst gegebenenfalls selbst das gerenderte Bild cachen. Allerdings trifft das System ziemlich gut. Hast du es mal probiert?

Ansonsten schließe ich mich meinem Vorredner an.
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
Also das Problem ist, dass das Programm 460MB RAM verschlingt, liegt an der Anzahl von "path" die erstellt werden, man könnte sich das so vorstellen, als würde man in Pages ein x-beliebiges Bild mit Linien darstellen, wobei jeder Pixel eine eigene Strecke bekommt. Und ja, ich habe kaum Cocoa Kenntnisse, aber ich lerne viel lieber mit learning by doing, habe das schon mit XHTML, JS, PHP und SQL geschafft. Habe aber grade eine Pascal Integrierung für XCode gefunden, funktioniert sogar alles bei mir :D dort ist das gesamte Fenster ein Koordinatensystem, werde es mal so ausprobieren und dann den Umstieg auf Cocoa langsamer angehen lassen als geplant.

Aber trotzdem Danke.
 

ifthenelse

Fießers Erstling
Registriert
07.12.06
Beiträge
129
Also das Problem ist, dass das Programm 460MB RAM verschlingt, liegt an der Anzahl von "path" die erstellt werden...

Versuch' doch mal, den Bezierpath mit alloc/init zu generieren und nach dem Zeichnen per Release wieder direkt freizugeben. Genauso die Farbe. So wie Du das jetzt machst, wird der Speicher, den Du mit 1,5 Mio Pathes und genauso vielen NSColor-Objekten belegst, erst (irgendwann) nach dem Zeichnen wieder freigegeben. D.h., wenn der Autoreleasepool meint, es wäre jetzt mal ganz praktisch sich zu entleeren...

Ansonsten schliesse ich mich Amin an: Quadrate gefüllt zeichnen, und die ohne Rand.

Gruss, Jörg
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Also das Problem ist, dass das Programm 460MB RAM verschlingt, liegt an der Anzahl von "path" die erstellt werden, man könnte sich das so vorstellen, als würde man in Pages ein x-beliebiges Bild mit Linien darstellen, wobei jeder Pixel eine eigene Strecke bekommt. Und ja, ich habe kaum Cocoa Kenntnisse, aber ich lerne viel lieber mit learning by doing, habe das schon mit XHTML, JS, PHP und SQL geschafft. Habe aber grade eine Pascal Integrierung für XCode gefunden, funktioniert sogar alles bei mir :D dort ist das gesamte Fenster ein Koordinatensystem, werde es mal so ausprobieren und dann den Umstieg auf Cocoa langsamer angehen lassen als geplant.

Aber trotzdem Danke.
Learning by doing ist ja okay. Es sollte bloß die Bewusstmachung der Konzepte einschließen. Sonst kommste nicht viel weiter.

Hierauf bezogen:

1) Für die Benennung der Methode würde ich dich ja standrechtlich erschießen. Aber gut, du wirst irgendwann damit reinfallen und es einsehen.

2) Du berechnest einen Path voraus , speicherst es sinnlos als Bezier-Pfad (Konzept-Verstoß: MVC) um es dann vllt zu benötigen.

3) Du berechnest mit $irgendeiner Genauigkeit, die hoffentlich passt (Konzept-Verstoß: Lazyness)

Also, um das mal auf den Punkt zu bringen:

- Die Daten würde ich in einem Container speichern. Dieser muss in der Lage sein, verschiedene Genauigkeiten zu verwalten und zwar unterschiedlich.

- Änderungen des Containers würde ich möglichst exakt triggern.

- Die Berechnungen würde ich lazy machen, halt dann, wenn der View die Genauigkeit benötigt.

- Wie bereits gesagt, kann man darüber nachdenken, das gerenderte Bild zu cachen, auch für etwiges Zooming.

Schau dir halt mal an, wie ansonsten mit komplexen Bildern umgegangen wird. Die werden ja auch zuerst ungenau gezeichnet und dann verfeinert. Aber das alles verlangt schon Kenntnisse von Konzepten.
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
ähhhm ich habe eine Auflösung von 1680*1050 und lasse das Bild in der Größe auch erzeugen, also ich lasse auch diese 1,5Mio "Pixel" erzeugen. Aber ja die Genauigkeit ist etwas hoch, das stimmt schon, will das dann später per NSTextField oder ner anderen Art vor dem berechnen bestimmen lassen. Weiter wird auch jeder Path verwendet, was ich aber machen könnte ist, die Farbe nicht einfärben lassen, wenn die Iterartion bei 0 schon erreicht ist. heißt, je höher, desto dunkler wird das entstandene Bild oder den ganzen NSView am Anfang komplett schwarz einfärben lassen.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
ähhhm ich habe eine Auflösung von 1680*1050 und lasse das Bild in der Größe auch erzeugen, also ich lasse auch diese 1,5Mio "Pixel" erzeugen. Aber ja die Genauigkeit ist etwas hoch, das stimmt schon, will das dann später per NSTextField oder ner anderen Art vor dem berechnen bestimmen lassen. Weiter wird auch jeder Path verwendet, was ich aber machen könnte ist, die Farbe nicht einfärben lassen, wenn die Iterartion bei 0 schon erreicht ist. heißt, je höher, desto dunkler wird das entstandene Bild oder den ganzen NSView am Anfang komplett schwarz einfärben lassen.
Ich finde es schon erstaunlich, dass das Programm auf deinen Rechner mit deiner Fenstergröße angepasst ist. Aber letztlich ist das unerheblich, da man nicht direkt diese Genauigkeit berechnen muss. Wie gesagt:Schaue dir mal andere Programme an …
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
mhh, also sobald ich damit Bildschrimhintergründe oder sonstiges erstellen will, dann brauche ich diese Genuigkeit schon. Aber ich glaube ich werde das gesamte Programm umschreiben, damit eine Bitmap erstellt wird, ist wahrscheinlich Ram freundlicher.