Jump to content
Unity Insider Forum

lücke bei kreisdiagramm


peachplayer

Recommended Posts

Hallo Leute

Ich versuche ein Kreisdiagramm zu machen. Leider klappt es nicht ganz, da es bei der Darstellung eine Lücke gibt(sieh Abb.).

Kann mir jemand helfen?

Ich benütze folgenden Code

¨using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

public class PieCharts : MonoBehaviour
{
    // Start is called before the first frame update

    public Image[] imagesPieChart;
    public float[] values;
    public List<Parzelle> liste1;
    public string KulturenAusgabe;
    public Text TextKulturenAusgabe;
    private void Awake()
    {
          liste1 = MyXML.DeserializeFromXML<Parzelle>(".\\Parzelle.xml");
       
    }
    void Start()
    {
        GenerateRandomPieChart();

    }
    public void Setvalues(List<float> valuesToSet)
    {
        float totalvalues = 0;
        for(int i=0; i < imagesPieChart.Length; i++) {
            totalvalues = FindPercentage(valuesToSet, i);
            Debug.Log("prozent= " + totalvalues + i);
            imagesPieChart[i].fillAmount = totalvalues;
        }
 


    }
    public void GenerateRandomPieChart()
    {
        List<float> valueList = new List<float>();
    

        foreach (Parzelle item in liste1)
        {
            if (item.Datum.Year == 2023 && )
            {
                valueList.Add(item.Fläche);

                KulturenAusgabe += item.Parzellenname + " " + item.Kultur + "\n";

                
            }

            TextKulturenAusgabe.text = KulturenAusgabe;
        }
        foreach(float item in valueList)
        {
            Debug.Log(item);
        }
       
            Debug.Log(valueList.Count);
 
        Setvalues(valueList);
    }
    private float FindPercentage(List<float> valuesToSet, int index)
    {
        float totalAmount = 0;
        for (int i=0; i < valuesToSet.Count; i++)
        {
            totalAmount += valuesToSet[i];
        }
        return valuesToSet[index] / totalAmount;
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

Gruss, peachplayer

grafik.thumb.png.4099302ba4570f5e3f6389ba60b95753.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Fehler unten in der Zeile sagt es dir eigentlich. Der Index ist außerhalb des Bereiches!
Du fährst also eine Liste oder ein Array ab und bist über die Grenze hinaus gekommen. 

Sind die Längen von ImagePieChart und ValuesToSet gleich?
Du gibst als index den Zähler i von ImagePieChart weiter und nutzt den dann beim Return ValuesToSet.
Ich schätze der Index wird größer sein als ValueToSet Einträge hat.
Das musst du mal vergleichen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schau halt mal nach, in welcher Zeile die Exception fliegt. In der Zeile hast du dann einen Zugriff mit einem zu großen oder zu kleinen Index.

Außerdem hast du noch den Stack Trace in deiner Fehlermeldung. Da steht, welche Methode diese Methode aufgerufen hat, welche Methode wiederum diese aufgerufen hat usw. So kannst du nachverfolgen, wo die fehlerhafte Zahl her kommt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

die Exception Fehlermeldung hat einen anderen Grund und hat nichts damit zu tun, dass eine Lücke beim Diagramm angezeigt wird (siehe Abb.) Es sind 5 Datenelemente die zusammen leider weniger als einen ganzen Kreis ergeben. Hat das etwas mit der Anweisung Fill.Origin zu tun? Da hierbei nur 4 verschiedene Werte(top, bottom, right u. left) möglich sind wird 1 Platz wohl doppelt besetzt.

grafik.thumb.png.1a658ec2807abaf0cf4ea1388887dbc6.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das kannst du nicht sagen!
Auch wenn ein Fehler nicht direkt mit dem Gezeigten zu tun hat, so kann sich dieser Fehler eben auf die Ausführung von anderen Codebereichen auswirken.
Kümmere dich immer darum, dass keine dieser Fehler auftreten. Das ist die einzige Möglichkeit um sicher zu sein, dass alles sauber abgearbeitet wird.
Denk immer daran, dass ein "index out of range" Fehler ein Build sofort beenden würde. Das ist also etwas Schwerwiegendes!

Soviel zur Fehlersuche.

Jetzt mal zu deinem Versuch das ats Tortendiagramm darzustellen:
Wenn ich das richtig sehe, legst du mehrere Images übereinander und drehst die im 90° Winkel? das kann nicht gehen, wenn du eine ungerade Zahl an Stücken darstellen willst (außer die 1 natürlich).

Das sind so Informationen, die uns weiter helfen würden! Ich hab gar nicht erkannt, dass du das mit dem Unity UI Image machst. ;)

Ja, das wird so nicht gehen. Das Einzige, was du machen kannst, wenn du denn das fillable Image als Grundlage weiter nutzten willst, ist, den Tortenstücken ihren eigenen Wert und die Werte der davor ermittelten Stücke ermitteln zu lassen. Den Wert der vorherigen Stücke ziehst du vom Vollkreis ab. Die Images bleiben in ihrer Ausrichtung wie sie sind.
Beispiel:
Du hast 3 Werte. Der erste Wert hat 25%. Der zweite Wert hat 60% und der dritte Wert hätte dann den Rest also 15%.
Du brauchst eine Variable, die zu Beginn auf 0 ist und als Zähler dient.
Du fährst deine Schleife ab und jedem Tortenstück wird der Wert des/der vorigen Stücke(s) abgezogen.
Du hast einen Stapel Images, die von unten nach oben ihre Werte bekommen.

Das erste Tortenstück hatte keinen Vorgänger, der Abzug (Zähler-Variable) ist also 0 und das Image bekommt somit einen Vollkreis. Der Wert dieses Stückes wird aber jetzt der Zähler-Variable übergeben. (25%)
Das zweite Stück hatte einen Vorgänger, somit wird diesem jetzt der Wert des Vorgängers abgezogen. Es ist also zu 75% gefüllt (der erste Wert war ja 25%). Die Variable bekommt den Wert des aktuelle Trotenstücks übergeben. ( 25% + 60%).
Dem letzten Stück wird auch wieder der Wert der Variable abgezogen und somit ist es nur noch 15% gefüllt (100%-85%).
Da liegen jetzt also 3 Images übereinander. Ein Vollkreis unten, ein Kreis der zu 75% gefüllt ist in der Mitte und ein Kreis zu 15% gefüllt darüber.
Für dich sieht es aber so aus, als wäre da ein 25% Teilstück linksoben, ein 60% Teilstück unten und ein 15% Teilstück rechtsoben.

Wenn deine Torte die Werte der Reihe nach im Uhrzeigersinn darstellen soll, dann musst du .fillClockwise auf false setzen.

Versuchs mal. :)

Wenn du jetzt noch von groß nach klein sortieren willst, musst du vorher mittels eines Hilfsarrays oder einer Hilfsliste die Werte sortieren. Aber das sind Dinge, die später wichtig werden. Erstmal muss alles dargestellt werden.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

image.thumb.png.7751bf36bdb4cb1161622f11b48243cb.png

herzlichen dank für danke für die tipps! Es sieht schon fast richtig, aus. D.h. der Kreis ist zu 100% gefüllt, jedoch überlappen sich noch 2 Kreis-Segmente(siehe Abb.)

Gruss peachplayer

 

  public void Setvalues(List<float> valuesToSet)
    {
        float restwert = 0.0f;
        float totalvalues = 1.0f;
        for (int i = 0; i < imagesPieChart.Length; i++)
        {
           
       
            totalvalues -= restwert;
            Debug.Log("i= " + i + "totalvalues=" + totalvalues * 100);
            restwert = FindPercentage(valuesToSet, i);
            imagesPieChart[i].fillAmount = totalvalues;
          
        }


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich glaube, dass deine Tortenstücke nicht alle am selben Punkt anfangen. Hast du Images verdreht oder ist der Start nicht bei 0°?
Mach dir doch mal ne Pause rein, so dass du erkennen kannst, wie ein Image nach dem anderen entsteht. Dann wirst du den Fehler bestimmt finden.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...