Sinusverlaufdarstellung

8

8989_Sinus

Gast
Hallo zusammen,

ich glaube mal ich bin hier richtig da es sich "nur" nur um den Sinus handelt.

Ich habe in ImageJ einen Sinusverlauf geschrieben. Das Problem ist, daß kein Sinusverlauf dargestellt wird. Zu sehen in dem Bild. Sinusverlauf
Wie bekomme ich einen ordentlichen Sinusverlauf hin? Sollte nicht bei 180° und einer Periode auch nur eine Periode dargestellt werden???

Eine weitere Sache ist, wie ändere ich die Frequenz? D.h. beginnen soll es mit einer Frequenz von 236px und aufhören bei 47px. Versucht habe ich es schon innerhalb der for-Schleife noch eine einzubauen allerdings kam dann immer eine Fehlermeldung. Vieleicht kennt jemand eine Lösung.

Danke und Gruß.

Java:
import ij.*;
import ij.ImagePlus;
import ij.plugin.PlugIn;
import ij.process.ImageProcessor;
import java.awt.*;


public class Sinusverlauf_2 implements PlugIn{

    int width = 800;
    int height = (int) (width/1.414);
    int x = 90*2;

    public void run(String arg){
    ImagePlus myImPlus = IJ.createImage("Sinusverlauf_2", "8-bit", width, height, 1);
    ImageProcessor ip = myImPlus.getProcessor();

        for (double i = 0; i <= x; i+=0.1) {
            double wert2 =Math.abs(256*Math.sin(2*Math.PI/(1)*Math.toRadians(i)));
            int sin2 = (int) wert2;
            Rectangle roib = ip.getRoi();
            ip.setRoi(roib);
            ip.setRoi((int)i, 0, 1, 100);
            ip.setValue(sin2);
            ip.fill();
            ip.putPixel((int)i, sin2+260, 0);
        }

    myImPlus.show();
    }
}
 

Monaria

Aktives Mitglied
Kenne mich damit jetzt nicht sonderlich aus, aber warum rufst du abs() auf?
Damit laufen positive und negative Ergebnisse der sinus-Funktion aufs gleiche hinaus.
Außerdem rechnet Math doch sowieso mit den Radians Werten, warum multiplizierst du die nochmal mit 2π?
 
8

8989_Sinus

Gast
Hallo,

Es geht mir bei der Darstellung des Sinusverlaufs in Grauwerten.

Es funktioniert auch ohne Math.abs() ich bin davon ausgegangen das die Farbwerte zwischen 0 und 255 (nur positive Werte) sein müssen daher der Betrag.
Danke der Tipp hat funktioniert! Bei ImageJ und Grauwertbildern junktionierts bei Java und RGB Bildern habe ich es nicht probiert.
Color(int r, int g, int b) Creates an opaque sRGB color with the specified red, green, and blue values in the range (0 - 255).

Das Math.toRadians(i) habe ich gemacht weil Java mit Rad rechnet und ich erst die 90*2 (180°) in Rad umrechnen will.

Gruß
 
8

8989_Sinus

Gast
Hier das gleiche in Java. Hier müssen die Werte positiv sein.

Java:
import java.awt.*;
import java.awt.Graphics;
import javax.swing.*;
import java.awt.Color;

public class Sinusfunktion_Eigene_Funktion extends javax.swing.JFrame{
    int width = 800;
    int height = (int) (width/1.414);
    double lp = 5.0;

    public Sinusfunktion_Eigene_Funktion() {
        // Hauptfenster einrichten
        setTitle("Sinusfunktion_Eigene_Funktion");
        setBounds(100,100,width,height);
        getContentPane().setBackground(Color.YELLOW);
        getContentPane().add(new Leinwand(), BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String args[]) {
        Sinusfunktion_Eigene_Funktion hauptfenster = new Sinusfunktion_Eigene_Funktion();
        hauptfenster.setVisible(true);
    }

    private class Leinwand extends JPanel {

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        for (double x = 0; x < 90*4; x+=0.11) {
            double wert =Math.abs(256*Math.sin(2*Math.PI/(lp)*Math.toRadians(x)));
            int sin = (int) wert;
            g.setColor(new Color(sin,sin,sin));
            g.drawRect((int) x, 0, 1, 200);
            g.setColor(new Color(0,0,0));
            g.drawRect((int)x, sin+265, 1, 1);
            System.out.println("sin = " + sin);
        }
    }
    }
}
 

Michael...

Top Contributor
Mit
Code:
Math.abs()
erhälst Du den Betrag einer Zahl. Der ist dann sicher positiv aber nicht das was Du willst. Du willst ja eine Verschiebung der "Mittellinie" in +y Richtung. Dazu musst du die Aplitude der Schwinung zum ursprunglichen Funktionswert dazuaddieren.
Und mit
Code:
(Math.sin(2*Math.PI/(lp)*Math.toRadians(x))
erhöhst Du die Frequenz der Schwingung, was Du ja auch nicht willst. Das Math.toRadians() passt, der Rest ist Käse. Allerdings sollte die Schleife dann bis 360 laufen, falls du eine volle Schwingung darstellen willst.
Details siehe Mathematik Klasse 10.
 
8

8989_Sinus

Gast
Danke Michael für den Hinweis mit dem Anheben der Funktion.

Das habe ich gewollt. Über 472 Pixel eine Periode.

Java:
        for (double i = 0; i <= 472; i+=0.1) {
        double a = 255.0/2;
        double p = 236;
        double c = 1;
        double d = 255.0/2;

            double wert =a*Math.sin((2*Math.PI/p)*i+Math.PI/c)+d;
            int sin = (int) wert;
            g.setColor(new Color(sin,sin,sin));
            g.drawRect((int) i, 0, 1, 200);
            g.setColor(new Color(0,0,0));
            g.drawRect((int)i, sin+250, 1, 1);

        }

Das zweite was ich nun möchte ist, das über 2360px die Perioden immer schmaler werden. Beginnen soll das ganze wie Bsp. oben mit 472px und einer Periode.

Java:
        double a = 255.0/2;
        double p = 236;
        double c = 1;
        double d = 255.0/2;

        for (double i = 0; i <= 2360; i+=0.1) {

            double p2 = i/59;

            double wert =a*Math.sin((2*Math.PI/p2)*i+Math.PI/c)+d;
            int sin = (int) wert;
            g.setColor(new Color(sin,sin,sin));
            g.drawRect((int) i, 0, 1, 200);
            g.setColor(new Color(0,0,0));
            g.drawRect((int)i, sin+250, 1, 1);
        }

Das war einer meiner Versuche. Wenn ich noch eine for-Schleife reinpacke wird es fast zu einer Endlosschleife.
 
S

SlaterB

Gast
i/59 ist für unter 59 immer 0 wegen int/int (edit: ok, nicht bei double i),
aber da du vorher 236 hattest sind selbst niedrige einstellige Werte recht unbrauchbar?

hier ein Anfang, wenn auch mit unschönen Effekten am Ende:
Java:
            int max = 1060; // mein Bildschirm ist nicht so breit..
            for (double i = 0; i <= max; i += 0.1)
            {
                double p2 = 236 * (max - i) / max;
 
8

8989_Sinus

Gast
@Slater danke für den Vorschlag.
Es soll später ausgedruckt werden daher die hohe Pixelanzahl.
Genau die Effekte am Ende sollen vermieden werden.
Bei dem Code wird leider zu Beginn eine kleine Gerade erzeugt.

Java:
        double a = 255.0/2;
        double p = 236;
        double c = 1;
        double d = 255.0/2;

        for (double i = 0; i <= 2360; i+=0.1) {
        double p2 = i/236;

            double wert2 =a*Math.sin((p2*Math.PI/p)*i+Math.PI/c)+d;
 

Oben