Способ сделать это без большого количества переменных и литья?


В настоящее время у меня есть этот код:

float tileX = (float)rectangle.X / (float)newTileSize;
float tileY = (float)rectangle.Y / (float)newTileSize;

int xOrigin = (int)Math.Round(tileX) * newTileSize;
int yOrigin = (int)Math.Round(tileY) * newTileSize;

// Same idea for the next 4 lines

float tileWidth = (float)rectangle.Width / (float)newTileSize;
float tileHeight = (float)rectangle.Height / (float)newTileSize;

int selectorWidth = (int)Math.Round(tileWidth) * newTileSize;
int selectorHeight = (int)Math.Round(tileHeight) * newTileSize;

Поводом для первых двух строк, потому что если я не бросить их, как поплавок, это целочисленное деление, и я вместо того, чтобы значения с плавающей точкой, так что я могу вокруг него в следующих двух строках.

Этот код нормально я думаю, просто кажется, что было бы лучше сделать это без литья. Просто кажется довольно подробный, если это делает никакого смысла.

Спасибо.



250
2
задан 18 августа 2011 в 05:08 Источник Поделиться
Комментарии
2 ответа

Так ты ищешь

int result = (int)Math.round((float)n/(float)d) * d;

(если вас интересуют только промежуточные значения для данного расчета)

Вот тест с альтернативой:

import junit.framework.TestCase;

public class TestModulo extends TestCase {

private final static int d = 7;

public void testModulo() throws Exception {
for (int n = 0; n < 30; n++) {
assertEquals("fails for " + n, f2(n), f1(n));
}
}

private int f1(int n) {
return (int) Math.round((float) n / (float) d) * d;
}

private int f2(int n) {
return ((n + d / 2) / d) * d;
}

}

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

2
ответ дан 18 августа 2011 в 05:08 Источник Поделиться


Поводом для первых двух строк, потому что если я не бросить их, как поплавок, это целочисленное деление, и я вместо того, чтобы значения с плавающей точкой, так что я могу вокруг него в следующих двух строках.

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

float tileX = (float)rectangle.X / newTileSize;
float tileY = (float)rectangle.Y / newTileSize;

Потому что вы работаете с системой.Чертеж.Прямоугольник тип там действительно нет другого пути, чтобы идти об этом. Все свойства имеют тип int, и вы должны выполнять арифметику с плавающей точкой, так что приведение не требуется. Можно, конечно, назначить х и у значений типа float во-первых, но это не спасет тебя ничего. Это очень часто при работе с графикой в WinForms.

1
ответ дан 18 августа 2011 в 05:08 Источник Поделиться