Exemple #1
0
void DBGridIF::RecalcStats(DBObjRecord *layerRec) {
    DBInt obsNum = 0;
    DBPosition pos;
    DBFloat value, cellArea;
    DBFloat sumWeight = 0.0, minimum = DBHugeVal, maximum = -DBHugeVal, average = 0.0, stdDev = 0.0;

    for (pos.Row = 0; pos.Row < RowNum(); ++pos.Row)
        for (pos.Col = 0; pos.Col < ColNum(); ++pos.Col)
            if (Value(layerRec, pos, &value)) {
                cellArea = CellArea(pos);
                sumWeight += cellArea;
                average = average + value * cellArea;
                minimum = minimum < value ? minimum : value;
                maximum = maximum > value ? maximum : value;
                stdDev = stdDev + value * value * cellArea;
                obsNum++;
            }
    if (obsNum > 0) {
        average = average / sumWeight;
        stdDev = stdDev / sumWeight;
        stdDev = stdDev - average * average;
        stdDev = sqrt(stdDev);
    }
    else
        average = stdDev = minimum = maximum = MissingValue();
    layerRec = ItemTable->Item(layerRec->RowID());
    AverageFLD->Float(layerRec, average);
    MinimumFLD->Float(layerRec, minimum);
    MaximumFLD->Float(layerRec, maximum);
    StdDevFLD->Float(layerRec, stdDev);
}
Exemple #2
0
void DBGridIF::DiscreteStats() {
    DBInt recordID, layerID;
    DBFloat area, sumArea = 0.0;
    DBPosition pos;
    DBObjTableField *areaFLD = ItemTable->Field(DBrNGridArea);
    DBObjTableField *percentFLD = ItemTable->Field(DBrNGridPercent);
    DBObjRecord *layerRec, *record;

    for (recordID = 0; recordID < ItemTable->ItemNum(); ++recordID) {
        record = ItemTable->Item(recordID);
        areaFLD->Float(record, 0.0);
        percentFLD->Float(record, 0.0);
    }
    for (layerID = 0; layerID < LayerNum(); ++layerID) {
        layerRec = Layer(layerID);
        for (pos.Row = 0; pos.Row < RowNum(); ++pos.Row)
            for (pos.Col = 0; pos.Col < ColNum(); ++pos.Col)
                if ((record = GridItem(layerRec, pos)) != (DBObjRecord *) NULL) {
                    area = CellArea(pos);
                    sumArea += area;
                    areaFLD->Float(record, areaFLD->Float(record) + area);
                }
    }
    for (recordID = 0; recordID < ItemTable->ItemNum(); ++recordID) {
        record = ItemTable->Item(recordID);
        percentFLD->Float(record, areaFLD->Float(record) * 100.0 / sumArea);
    }
}
void csRectFlattenModifier::Displace(iTerrainCell* cell, float intensity) const
{
  csRect area = WorldArea(cell);

  area.Intersect(bb.MinX(), bb.MinY(), bb.MaxX(), bb.MaxY());

  area = CellArea(cell, area);

  //printf("area: %d, %d - %d, %d\n\n", area.xmin, area.ymin%256, area.xmax, area.ymax);

  csLockedHeightData data = cell->LockHeightData (area);

  float val = (center.y/cell->GetSize().z)*intensity;

  for (size_t y = 0; y < size_t (area.Height()); y++)
    for (size_t x = 0; x < size_t (area.Width()); x++)
    {
      data.data[y * data.pitch + x] = val;
    }

  cell->UnlockHeightData ();
}