Войти

Показать полную графическую версию : Помогите написать расширяемую версию этого метода


amohax
01-03-2011, 19:00
Я кликаю мышкой в поле 500х500 пикселей. Это поле разделено на квадраты 10х10. Каждый квадрать по 50х50. Как узнать в какой я квадрат ткнул?
Кроме этого ничего придумать не смог:
private int getCord(int x)
{
if (x > 0 & x < 50) x = 0;
if (x > 50 & x < 100) x = 1;
if (x > 100 & x < 150) x = 2;
if (x > 150 & x < 200) x = 3;
if (x > 200 & x < 250) x = 4;
if (x > 250 & x < 300) x = 5;
if (x > 300 & x < 350) x = 6;
if (x > 350 & x < 400) x = 7;
if (x > 400 & x < 450) x = 8;
if (x > 450 & x < 500) x = 9;

return x;
}
Вызываю сначало для кордиты Х, а потом и для У
Но это идиотский код мне кажется.

Если мне понадобиться сделать поле больше или меньше (например 550х550), то придется переписывать этот метод. Не говоря уже о том, что невозможно изменить размер поля из настроек программы.

Подскажите что тут можно сделать?

Beyound
01-03-2011, 20:54
почему идиотский.. вполне нормальный, правда я бы иф-элсы использовал.. для большего стиля так сказать, но вообще ничего другого тут не придумать.У тебя же эти квадраты не объекты чтобы вернуть какието значения а, как я понял, просто фоновый рисунок и все. Вот если бы они были объектами то это другое дело.
хотя мона так
int ответ= (x - x%50)/50;
но над еще проверить чтобы больше 500 мышка не выходила

pva
01-03-2011, 21:02
В какой квадрат попадает x = 450?

Как немного сишник, могу посоветовать пользоваться округлением при делении нацело return max(0, min(9, x/50))

lxa85
01-03-2011, 21:24
Во первых, как правильно сказал pva, надо определиться с попаданием в точки кратные 50. А во вторых - использовать деление.
Возвращаемая координата есть, разделить ее нацело и все. И не надо никаких сравнений делать.
Если от попадания в квадрат зависит более чем одна величина, то использовать выбор case или подобный. Я думаю в .NET должно быть нечто подобное.

Admiral
01-03-2011, 22:46
amohax, когда столкнулся с подобной задачей (на VB.NET) использовал следующую технику.
Завёл две переменные, ширину и высоту прямоугольника (для квадрата можно одну), как поля класса. В конструкторе получал их размер в зависимости от требуемого поля (делил размеры клиентской области). А в обработчике клика пробегался по прямоугольникам (квадратам).
Class Form1
Inherits Form
Dim i As Byte = 0
Dim apt(1) As Point
Dim dX, dY As Integer
'...
Sub New()
dX = Me.ClientSize.Width / 5
dY = Me.ClientSize.Height / 5
End Sub
Protected Overrides Sub OnMouseClick(ByVal mea As MouseEventArgs)
'...
For iD As Integer = 0 To Me.ClientSize.Width Step dX
If (iD &lt;= mea.Location.X) And (mea.Location.X &lt; iD + dX) Then
apt(i).X = iD + dX / 2
iD = Me.ClientSize.Width 'break
End If
Next iD

For iD As Integer = 0 To Me.ClientSize.Height Step dY
If (iD &lt;= mea.Location.Y) And (mea.Location.Y &lt; iD + dY) Then
apt(i).Y = iD + dY / 2
iD = Me.ClientSize.Height 'break
End If
Next iD
'...
End If
End Sub
'...
End Class
В приведённом коде нету округлений (значения целые, так как величины в полпикселя не бывает), однако они рекомендованы для случаёв с малыми квадратами. Да и границы квадратов нужно включать.

amohax
02-03-2011, 07:08
Спасибо за ответы!

Деление это то что нужно. Сам никак не мог найти что на что делить. Оказалось надо делить полученную координату на ширину квадрата, вот такой код получился:
private int getCord(int x)
{
x = (int)(x / 50);
return x;
}




© OSzone.net 2001-2012