Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите написать расширяемую версию этого метода (http://forum.oszone.net/showthread.php?t=200835)

amohax 01-03-2011 19:00 1624722

Помогите написать расширяемую версию этого метода
 
Я кликаю мышкой в поле 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 1624808

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

pva 01-03-2011 21:02 1624812

В какой квадрат попадает x = 450?

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

lxa85 01-03-2011 21:24 1624828

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

Admiral 01-03-2011 22:46 1624878

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 1625040

Спасибо за ответы!

Деление это то что нужно. Сам никак не мог найти что на что делить. Оказалось надо делить полученную координату на ширину квадрата, вот такой код получился:
Код:

        private int getCord(int x)
        {
            x = (int)(x / 50);
            return x;
        }



Время: 13:03.

Время: 13:03.
© OSzone.net 2001-