Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Помогите написать расширяемую версию этого метода

Ответить
Настройки темы
.NET - Помогите написать расширяемую версию этого метода

Аватара для amohax

Пользователь


Сообщения: 69
Благодарности: 2

Профиль | Отправить PM | Цитировать


Я кликаю мышкой в поле 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), то придется переписывать этот метод. Не говоря уже о том, что невозможно изменить размер поля из настроек программы.

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

Отправлено: 19:00, 01-03-2011

 

Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось Beyound, 01-03-2011 в 21:01.


Отправлено: 20:54, 01-03-2011 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 21:02, 01-03-2011 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:24, 01-03-2011 | #4


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


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
В приведённом коде нету округлений (значения целые, так как величины в полпикселя не бывает), однако они рекомендованы для случаёв с малыми квадратами. Да и границы квадратов нужно включать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:46, 01-03-2011 | #5


Аватара для amohax

Пользователь


Сообщения: 69
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 07:08, 02-03-2011 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Помогите написать расширяемую версию этого метода

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Помогите написать программу на С++ rivz2007 Программирование и базы данных 4 05-09-2010 16:54
Разное - Помогите написать код FlatX007 Программирование и базы данных 1 23-05-2009 14:40
C/C++ - Помогите определить версию Virnual c++. Zh.Ron Программирование и базы данных 5 15-10-2008 12:58
FreeBSD - Помогите написать скрипт Stirs Общий по FreeBSD 2 25-06-2008 02:29
Помогите написать скрипт!!! Sergei Antoshkin Вебмастеру 1 13-03-2003 18:22




 
Переход