2016-07-07 2 views
0

Я добавляю в цикл for для поиска значений min и max в массиве, который я получаю от разбора текстового файла. Найти максимальное значение было достаточно просто, но для min я получаю нулевое значение, где оно должно быть 1. Вот что я использую для цикла - (я до сих пор тестирую только, чтобы получить min temp. x)добавление скрипта для поиска значения min для цикла for C#

 for (int i = 0; i < lineCount; i++) { 

     string line = dataLines [i]; 
     lineValues = line.Split (' '); 

     Vector4 temp = new Vector4(); 
     Vector3 center = new Vector3(); 

     temp.x = float.Parse (lineValues [0]); 

     maxvalueX = float.MinValue; 
     minvalueX = float.MaxValue; 

     if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
     if (temp.x < minvalueX) { minvalueX = temp.x; } 

     temp.y = float.Parse (lineValues [1]); 
      if (temp.y > maxvalueY) { maxvalueY = temp.y; } 

     temp.z = float.Parse (lineValues [2]); 
      if (temp.z > maxvalueZ) { maxvalueZ = temp.z; } 

     temp.w = float.Parse (lineValues [3]); 

     data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w); 
     data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w); 
     //int value = data.myData [i].x; 

     center.x = ((maxvalueX-1)/2); 
     center.y = ((maxvalueY-1)/2); 
     center.z = ((maxvalueZ-1)/2); 

     data.dataCenter.Set (scaleFactor*center.x, scaleFactor*center.y, scaleFactor*center.z); 
    } 

любые идеи о том, что происходит не так здесь, будем очень благодарны! Спасибо! Джен

+0

Что вы инициализация значений min до? Как правило, вы хотите установить их как 'float.MaxValue'. Если вы не инициализируете их, то по умолчанию они будут 0, что меньше 1. У вас будет такой же тип проблемы с max, если все ваши значения были отрицательными, поэтому он действительно должен быть инициализирован чем-то вроде 'float .MinValue'. – juharr

+0

Почему вы не используете dataLines.Min(); получить самый маленький? – Naeim

+1

Перед циклом вам нужно поместить 'maxvalueX = float.MinValue;' и 'minvalueX = float.MaxValue;' перед тем, как сбросить значения. – Octopoid

ответ

6

Самый простой способ найти минимальные значения, чтобы сделать противоположное тому, что вы сделали с максимальными значениями, т.е.

if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
if (temp.x < minvalueX) { minvalueX = temp.x; } 

Медведь в мин, что, если это возможно, что самое низкое значение выше 0 или наивысшее значение ниже 0, оставляя значения по умолчанию max и min равными 0, вызовет проблемы. Перед тем как петля вы должны настроить их так:

float maxvalueX = float.MinValue; 
float minvalueX = float.MaxValue; 

Таким образом, вы можете быть уверены, что номера будут сброшены независимо от значения они сталкиваются. Убедитесь, что вы справляетесь с тем, что они не являются значениями, которые следует учитывать.


UPDATE:

Я включил полную обновленную версию кода с комментариями, чтобы продемонстрировать, что я имею в виду:

// These should be before the loop just to avoid resetting the max/min values 
float maxvalueX = float.MinValue; 
float minvalueX = float.MaxValue; 

    for (int i = 0; i < lineCount; i++) { 

    string line = dataLines [i]; 
    lineValues = line.Split (' '); 

    Vector4 temp = new Vector4(); 
    Vector3 center = new Vector3(); 

    temp.x = float.Parse (lineValues [0]); 
    if (temp.x > maxvalueX) { maxvalueX = temp.x; } 
    if (temp.x < minvalueX) { minvalueX = temp.x; } 

    temp.y = float.Parse (lineValues [1]); 
     if (temp.y > maxvalueY) { maxvalueY = temp.y; } 

    temp.z = float.Parse (lineValues [2]); 
     if (temp.z > maxvalueZ) { maxvalueZ = temp.z; } 

    temp.w = float.Parse (lineValues [3]); 

    data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w); 
    data.myData [i].Set (scaleFactor*temp.x, scaleFactor*temp.y, scaleFactor*temp.z, temp.w); 
    //int value = data.myData [i].x; 
} 

// I've moved these out of the loop as they only use the final max/min values 
    center.x = ((maxvalueX-1)/2); 
    center.y = ((maxvalueY-1)/2); 
    center.z = ((maxvalueZ-1)/2); 

    data.dataCenter.Set (scaleFactor*center.x, scaleFactor*center.y, scaleFactor*center.z); 
+0

Я добавил это, и он меняет минимальное значение на максимальное значение - спасибо! – jrogers12

+0

Вы уверены, что вы случайно не использовали 'maxvalueX' вместо' minvalueX'? Легко выполняется при копировании и вставке линий. – Octopoid

+0

Большое спасибо! Я положил float maxvalueX = float.MinValue; float minvalueX = float.MaxValue; в петле. Еще раз спасибо! – jrogers12

0

Попробуйте

if (minvalueX < temp.x) 
{ 
    valueX = temp.x; 
    minvalueX = valueX; 
} 
+0

Я уже пробовал это, но спасибо !! – jrogers12

Смежные вопросы