Показать полную графическую версию : Помогите написать расширяемую версию этого метода
Я кликаю мышкой в поле 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), то придется переписывать этот метод. Не говоря уже о том, что невозможно изменить размер поля из настроек программы.
Подскажите что тут можно сделать?
почему идиотский.. вполне нормальный, правда я бы иф-элсы использовал.. для большего стиля так сказать, но вообще ничего другого тут не придумать.У тебя же эти квадраты не объекты чтобы вернуть какието значения а, как я понял, просто фоновый рисунок и все. Вот если бы они были объектами то это другое дело.
хотя мона так
int ответ= (x - x%50)/50;
но над еще проверить чтобы больше 500 мышка не выходила
В какой квадрат попадает x = 450?
Как немного сишник, могу посоветовать пользоваться округлением при делении нацело return max(0, min(9, x/50))
Во первых, как правильно сказал pva, надо определиться с попаданием в точки кратные 50. А во вторых - использовать деление.
Возвращаемая координата есть, разделить ее нацело и все. И не надо никаких сравнений делать.
Если от попадания в квадрат зависит более чем одна величина, то использовать выбор case или подобный. Я думаю в .NET должно быть нечто подобное.
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 <= mea.Location.X) And (mea.Location.X < 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 <= mea.Location.Y) And (mea.Location.Y < iD + dY) Then
apt(i).Y = iD + dY / 2
iD = Me.ClientSize.Height 'break
End If
Next iD
'...
End If
End Sub
'...
End Class
В приведённом коде нету округлений (значения целые, так как величины в полпикселя не бывает), однако они рекомендованы для случаёв с малыми квадратами. Да и границы квадратов нужно включать.
Спасибо за ответы!
Деление это то что нужно. Сам никак не мог найти что на что делить. Оказалось надо делить полученную координату на ширину квадрата, вот такой код получился:
private int getCord(int x)
{
x = (int)(x / 50);
return x;
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.