Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Mastermind

unregistriert

11

09.07.2010, 11:30

@Mastermind, so mache ich das auch, nur funktioniert es aus irgendwelchen Gründen trotzdem nicht richtig. Die Canvas Struktur kann auch Bézierkurven zeichnen, kann man damit einfach 2 Punkte exponentiell miteinander verbinden?



Ich glaube nicht dass du es so machst, weil 1. in deinem pow ein + 1.0f steht, was in keiner Formel bislang vorkommt und 2. es wahrscheinlich funktionieren würde wenn du es so machen würdest.

Das Problem ist dass du den Zeichencode extrem eng mit der Programmlogik verbunden hast und wie ich schon sagte habe ich keine Lust den Zeichencode auch noch zu kapieren.

Probier doch mal folgendes:

Rechne erst ganz stumpf und genau nach Formel den Funktionswert aus. Dabei kann eigentlich nichts schief gehen, da es wirklich trivial ist, aber du kannst diesen Wert auch prima mit dem Debugger oder zur Not der Konsole überprüfen um ganz sicher zu sein.

Erst danach(!) wendest du die Transformation an, die das auf dein Canvas bringt. Mit Rand und was auch immer die anderen magischen Konstanten in deinem Code zu bedeuten haben.

Wenn es dann immer noch nicht geht kannst du zunindest sicher sein, dass du nur falsch zeichnest.

Besser wäre natürlich es gäbe nach diesem refactoring keine magischen Konstanten mehr, dann wäre dein Code vielleicht auch leichter zu lesen.

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

12

14.07.2010, 20:36

Es funktioniert :D :D

Ich habe es jetzt so gemacht wie ihr vorgeschlagen habt, erst die Werte normalisieren, dann die genauen Werte für x% der Zeit ausrechnen und in eine Tabelle speichern und erst zum Schluss transformieren und zeichnen.

Hier die komplette Paint-Funktion (auch wenn es niemand interessiert):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
void __fastcall TFEnvelope::OnPaintGraph(TObject *Sender)
{
    PBGraph->Canvas->Brush->Color = clSilver;
    PBGraph->Canvas->Rectangle(0, 0, PBGraph->Width, PBGraph->Height);

    PBGraph->Canvas->Pen->Color = clBlack;
    PBGraph->Canvas->PenPos = TPoint(4, 5);
    PBGraph->Canvas->LineTo(PBGraph->Width - 5, 5);
    PBGraph->Canvas->PenPos = TPoint(4, 5);
    PBGraph->Canvas->LineTo(4, PBGraph->Height - 5);
    PBGraph->Canvas->Pen->Color = clWhite;
    PBGraph->Canvas->PenPos = TPoint(PBGraph->Width - 5, PBGraph->Height - 5);
    PBGraph->Canvas->LineTo(PBGraph->Width - 5, 5);
    PBGraph->Canvas->PenPos = TPoint(PBGraph->Width - 5, PBGraph->Height - 5);
    PBGraph->Canvas->LineTo(4, PBGraph->Height - 5);

    PBGraph->Canvas->Brush->Color = clBlack;
    PBGraph->Canvas->Pen->Color = clNavy;

    int iPosition = 0, iLastI;
    float fValue = 0.0f, fLastValue;
    float afValues[101];

    for(int i = 0; i < 101; i++)
    {
        if((m_EnvelopeProfile.afPoints[i] == -999999.9f) && (i != 0) && (i != 100))
            continue;

        if(m_EnvelopeProfile.afPoints[i] == -999999.9f)
            m_EnvelopeProfile.afPoints[i] = m_fDefault;

        fLastValue = fValue;
        if(m_EnvelopeProfile.bIsLinear)
            fValue = -m_EnvelopeProfile.afPoints[i] + m_fMax;
        else
            fValue = m_EnvelopeProfile.afPoints[i] - m_fMin + 1.0f ;

        if(m_EnvelopeProfile.bIsLinear)
        {
            if(i == 0)
                PBGraph->Canvas->PenPos = TPoint(5, (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * fValue + 5.0f));
            else
                PBGraph->Canvas->LineTo((int)(((float)(PBGraph->Width - 5)) / 100.0f * (float)(i)), (int)((float)((PBGraph->Height - 11)) / (m_fMax - m_fMin) * fValue + 5.0f));
        }
        else
        {
            if(i == 0)
                PBGraph->Canvas->PenPos = TPoint(5, (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * ((-fValue + m_fMax - m_fMin) + 1.0f) + 5.0f));
            else
            {
                for(int j = iLastI; j <= i; j++)
                    afValues[j] = fLastValue * pow(fValue / fLastValue, (float)(j - iLastI) / (float)(i - iLastI));

                PBGraph->Canvas->PenPos = TPoint((int)(((float)(PBGraph->Width - 5)) / 100.0f * (float)(i)), (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * ((-fValue + m_fMax - m_fMin) + 1.0f) + 5.0f));
            }
        }

        if(LBPoints->ItemIndex == iPosition)
            PBGraph->Canvas->Brush->Color = clWhite;
        else
            PBGraph->Canvas->Brush->Color = clBlack;
        PBGraph->Canvas->Rectangle(PBGraph->Canvas->PenPos.x - 3, PBGraph->Canvas->PenPos.y - 3, PBGraph->Canvas->PenPos.x + 3, PBGraph->Canvas->PenPos.y + 3);

        iPosition++;
        iLastI = i;
    }

    if(!m_EnvelopeProfile.bIsLinear)
    {
        for(int i = 0; i < 101; i++)
        {
            if(i == 0)
                PBGraph->Canvas->PenPos = TPoint(5, (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * ((-afValues[i] + m_fMax - m_fMin) + 1.0f) + 5.0f));
            else
                PBGraph->Canvas->LineTo((int)(((float)(PBGraph->Width - 5)) / 100.0f * (float)(i)), (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * ((-afValues[i] + m_fMax - m_fMin) + 1.0f) + 5.0f));
        }
     }

    PBGraph->Canvas->Brush->Color = clSilver;
    PBGraph->Canvas->TextOutA(10, 6, m_fMax);
    PBGraph->Canvas->TextOutA(10, PBGraph->Height - 20, m_fMin);
    if(m_fMin < 0.0f)
        PBGraph->Canvas->TextOutA(10, (int)(((float)(PBGraph->Height - 11)) / (m_fMax - m_fMin) * m_fMax), "0");
    if(CBRelativeValues->Checked)
        PBGraph->Canvas->TextOutA(PBGraph->Width - 78, PBGraph->Height - 20, "100% der Zeit");
    else
    {
        char acBuffer[256];
        sprintf(acBuffer, "%.2fs", FCreateSound->m_fDuration);
        PBGraph->Canvas->TextOutA(PBGraph->Width - 50, PBGraph->Height - 20, acBuffer);

    }
}


Also dann danke für eure Hilfe.

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

13

14.07.2010, 23:28

Zitat

Hier die komplette Paint-Funktion (auch wenn es niemand interessiert)


Mich zwar auch nicht, aber vlt interessiert es ja später jemanden ;)
Ich finde es nämlich deprimierend, wenn ich ein Topic zu einem Problem gefunden habe und dann keine lösung da ist ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

Werbeanzeige