caid Skrevet 15. mars 2011 Del Skrevet 15. mars 2011 Holder på å lage et lite program som regner ut antall liter i en tank ved en gitt fyllingshøyde. Tanken er ikke linjær, men jeg har en peiletabell, som jeg har lagret i en xml fil. Er litt usikker på om jeg har løst dette på den beste måten, derfor poster jeg denne utfordringen her. Slik at om noen vil prøve seg, så kan jeg sammenligne løsningen med min. Kommer til å poste min egen kode om et par dager, men håper på å få et par andre løsninger innen den tid. Noen som har lyst til å lage en klasse med to metoder, som retunerer henholdsvis antall liter i tanken ved en gitt veskehøyde, og veskehøyde i mm ved antall liter i tanken. Se lenger nede i posten for eks på metoder. Eks på peiletabell: mm - liter 100 - 10 200 - 30 300 - 60 400 - 100 500 - 150 600 - 200 Metoder int GetLtr(int mm)... int GetMM(int ltr).. Lenke til kommentar
GeirGrusom Skrevet 17. mars 2011 Del Skrevet 17. mars 2011 (endret) Noe slikt kanskje? public class Tank { [serializable] public class Item { public double Meters { get; set; } public double Litres { get; set; } public override string ToString() { return string.Format("{0} meters - {1} litres", Meters, Litres); } } private List<Item> items { get; set; } public IEnumerable<Item> Items { get { return items.AsReadOnly(); } } public Tank(IEnumerable<Item> generator) { items = new List<Item>(generator); } private static double Interpolate(double x1, double x2, double t) { return x1 + (x2 - x1) * t; } private double GetGeneric(double value, Func<Item, double> item1, Func<Item, double> item2) { var max = items.Max(item1); if (value > max || value < 0) throw new ArgumentOutOfRangeException(); else if (value == max) return max; var index = items.FindIndex(item => item1(item) > value); if (index == -1) throw new Exception("An unknown error occured"); var x2 = item1(items[index]); var x1 = index - 1 < 0 ? 0 : item1(items[index - 1]); var t = (value - x1) / (x2 - x1); return Interpolate(index < 0 ? 0 : item2(items[index - 1]), item2(items[index]), t); } public double GetMeters(double litres) { return GetGeneric(litres, i => i.Litres, i => i.Meters); } public double GetLitres(double meters) { return GetGeneric(meters, i => i.Meters, i => i.Litres); } } edit: forkortet noe Måtte gjøre en antagelse av formen på tanken dog, altså at den består kun av rette kanter. Endret 21. mars 2011 av GeirGrusom Lenke til kommentar
DidzisK Skrevet 25. mars 2011 Del Skrevet 25. mars 2011 Jeg prøvde meg litt fram i Excel og det viste seg at det går an å lage en formel som returnerer volum som fuksjon av målt høyde. Her er det brukt polynom med order 4, hvis det var mitt prosjekt ville jeg kanskje gått for 2. For å reversere det må du nok interpolere eller bruke en eller annen iterasjonsmetode, for eksempel Newtons - det spørs hvor nøyaktig resultatet må være. Beklager, ingen C# innhold her, men implementering av formelen må være trivielt. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå