Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Определение координат пересечения линии и фигуры - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Определение координат пересечения линии и фигуры
perven Дата: Среда, 13.12.2017, 10:21 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Физкульт привет, стахановцы макросного дела.
Помогите решить задачу.

На листе нарисована фигура - в виде области. Также на листе нарисована прямая, пересекающая эту фигуру-область.

Как макросом найти координаты точек пересечения линии с данной фигурой ?
К сообщению приложен файл: 345748.xls (37.5 Kb)
 
Ответить
СообщениеФизкульт привет, стахановцы макросного дела.
Помогите решить задачу.

На листе нарисована фигура - в виде области. Также на листе нарисована прямая, пересекающая эту фигуру-область.

Как макросом найти координаты точек пересечения линии с данной фигурой ?

Автор - perven
Дата добавления - 13.12.2017 в 10:21
perven Дата: Среда, 13.12.2017, 17:12 | Сообщение № 2
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
nilem, при чем тут автокад ?

Я спрашиваю - как это в экселе сделать.
Хотя бы в теории.
 
Ответить
Сообщениеnilem, при чем тут автокад ?

Я спрашиваю - как это в экселе сделать.
Хотя бы в теории.

Автор - perven
Дата добавления - 13.12.2017 в 17:12
alex77755 Дата: Четверг, 14.12.2017, 04:56 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

запомнить координаты линии. убрать уё куда-нибудь. и ползти по бывшему её месту считывая цвет пикселя.
Линий же ограничивающих фигуру нет


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщениезапомнить координаты линии. убрать уё куда-нибудь. и ползти по бывшему её месту считывая цвет пикселя.
Линий же ограничивающих фигуру нет

Автор - alex77755
Дата добавления - 14.12.2017 в 04:56
perven Дата: Четверг, 14.12.2017, 14:16 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
и ползти по бывшему её месту считывая цвет пикселя.

А что вы имеете ввиду по словами -"ползти по бывшему ее месту" ?
Это какой-то алгоритм ?
 
Ответить
Сообщение
и ползти по бывшему её месту считывая цвет пикселя.

А что вы имеете ввиду по словами -"ползти по бывшему ее месту" ?
Это какой-то алгоритм ?

Автор - perven
Дата добавления - 14.12.2017 в 14:16
alex77755 Дата: Четверг, 14.12.2017, 14:34 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

каждая точка на экране имеет свой цвет. если фигура залита одним цветом, то искать координаты начала и конца этого цвета по пути линии. Для линии нужно вывести её уравнение. определить направление (линия задаётся прямоугольником. в этом прямоугольнике может быть 2 линии: так уж мелкософтовцы решили, что любую фигуру можно отображать зеркально). ну и потом по этому уравнению считать координаты и проверять цвет пикселя


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщениекаждая точка на экране имеет свой цвет. если фигура залита одним цветом, то искать координаты начала и конца этого цвета по пути линии. Для линии нужно вывести её уравнение. определить направление (линия задаётся прямоугольником. в этом прямоугольнике может быть 2 линии: так уж мелкософтовцы решили, что любую фигуру можно отображать зеркально). ну и потом по этому уравнению считать координаты и проверять цвет пикселя

Автор - alex77755
Дата добавления - 14.12.2017 в 14:34
perven Дата: Четверг, 14.12.2017, 16:39 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
alex77755, ну в принципе - то что фигура-линия может быть описана уравнением с использованием начальной и конечной координаты - это понятно.
А вот про то, что ВБА умеет анализировать пиксели на листе - никогда раньше не слышал.

Вы можете привести примерный макрос определения пикселя конкретной координаты листа ?
 
Ответить
Сообщениеalex77755, ну в принципе - то что фигура-линия может быть описана уравнением с использованием начальной и конечной координаты - это понятно.
А вот про то, что ВБА умеет анализировать пиксели на листе - никогда раньше не слышал.

Вы можете привести примерный макрос определения пикселя конкретной координаты листа ?

Автор - perven
Дата добавления - 14.12.2017 в 16:39
alex77755 Дата: Четверг, 14.12.2017, 19:08 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

конкретной не охота возиться. но цвет пикселя с координатами курсора можно так:

[vba]
Код
Private Declare Function CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Any)
Private Declare Function DeleteDC& Lib "gdi32" (ByVal hdc As Long)
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
x As Long
y As Long
End Type
Dim z As POINTAPI

Private Sub кнопка_Click()
GetCursorPos z
screendc = CreateDC("DISPLAY", "", "", 0&)
MsgBox (GetPixel(screendc, z.x, z.y))
DeleteDC (screendc)
End Sub
[/vba]

вместо z.x и z.y надо подставлять нужные координаты


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Четверг, 14.12.2017, 19:09
 
Ответить
Сообщениеконкретной не охота возиться. но цвет пикселя с координатами курсора можно так:

[vba]
Код
Private Declare Function CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Any)
Private Declare Function DeleteDC& Lib "gdi32" (ByVal hdc As Long)
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
x As Long
y As Long
End Type
Dim z As POINTAPI

Private Sub кнопка_Click()
GetCursorPos z
screendc = CreateDC("DISPLAY", "", "", 0&)
MsgBox (GetPixel(screendc, z.x, z.y))
DeleteDC (screendc)
End Sub
[/vba]

вместо z.x и z.y надо подставлять нужные координаты

Автор - alex77755
Дата добавления - 14.12.2017 в 19:08
Roman777 Дата: Четверг, 14.12.2017, 22:28 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
perven, всё же это больше к алгебре будет...
[vba]
Код
Type point_
    X As Single
    Y As Single
End Type
Sub CrossPoint1()
Dim shp1 As Shape, line1 As Shape
Dim p1() As point_, p2(2) As point_
Dim po1() As Single
Dim count1 As Long
Dim K1 As Single, K2 As Single, d1 As Single, d2 As Single
Dim X As Single, Y As Single
Dim VF As Boolean, HF As Boolean
Dim diam As Single
Dim k As Integer
Set shp1 = ActiveSheet.Shapes("Полилиния 1")
Set line1 = ActiveSheet.Shapes("Прямая соединительная линия 8")
    With shp1.DrawingObject.ShapeRange.Nodes
        count1 = .Count
        ReDim p1(count1)
        For i = 1 To count1
            po1 = .Item(i).Points
            p1(i).X = po1(1, 1)
            p1(i).Y = po1(1, 2)
        Next i
    End With
    p2(1).X = line1.Left
    ' следующие свойства меняется при изменении положения отрезка в пространстве _
    (0-90: V=-1, H=0; 90-180: V=-1, H=-1; 180-270: V=0, H=-1; 270-360: V=0, H=0)
    VF = line1.DrawingObject.ShapeRange.VerticalFlip ' свойство меняется при изменении положения отрезка в пространстве
    HF = line1.DrawingObject.ShapeRange.HorizontalFlip ' свойство меняется при изменении положения отрезка в пространстве
    If VF = HF Then
        p2(1).X = line1.Left
        p2(1).Y = line1.Top
        p2(2).X = line1.Left + line1.Width
        p2(2).Y = line1.Top + line1.Height
    Else
        p2(1).X = line1.Left
        p2(1).Y = line1.Top + line1.Height
        p2(2).X = line1.Left + line1.Width
        p2(2).Y = line1.Top
    End If
    k = 10
    For i = 1 To count1 - 1
        K1 = (p1(i + 1).Y - p1(i).Y) / (p1(i + 1).X - p1(i).X)
        K2 = (p2(2).Y - p2(1).Y) / (p2(2).X - p2(1).X)
        d1 = (p1(i + 1).X * p1(i).Y - p1(i).X * p1(i + 1).Y) / (p1(i + 1).X - p1(i).X)
        d2 = (p2(2).X * p2(1).Y - p2(1).X * p2(2).Y) / (p2(2).X - p2(1).X)
        If (K1 <> K2) Then
            X = (d2 - d1) / (K1 - K2)
            Y = K1 * X + d1
        End If
        If belongs(X, Y, p1(i), p1(i + 1)) Then
            diam = 20 'диаметр кружков
            Set ff = ActiveSheet.Shapes.AddShape(msoShapeDonut, X - diam / 2, Y - diam / 2, diam, diam)
            ff.Line.ForeColor.RGB = RGB(255, 0, 0)
            k = k + 1
            Cells(k, 3) = X
            Cells(k, 4) = Y
        End If
    Next i
End Sub
Function belongs(X As Single, Y As Single, p1 As point_, p2 As point_) As Boolean
    Dim Xbool As Boolean
    Dim Ybool As Boolean
    If p1.X >= p2.X Then
        If X <= p1.X And X >= p2.X Then
           Xbool = True
        End If
    Else
        If X <= p2.X And X >= p1.X Then
           Xbool = True
        End If
    End If
    If p1.Y >= p2.Y Then
        If Y <= p1.Y And Y >= p2.Y Then
           Ybool = True
        End If
    Else
        If Y <= p2.Y And Y >= p1.Y Then
           Ybool = True
        End If
    End If
    belongs = Xbool And Ybool
End Function
[/vba]
[p.s.]Добавлю ещё, что макрос должен корректно работать только с фигурами, образованными прямыми линиям. Если рассматривать работу аналогичного макроса для криволинейных фигур, необходимо будет где-то получить информацию о том какие именно сплайны microsoft применяют тут (что-то беглый просмотр интернета этой информации мне не дал), и придётся решать уже систему нелинейных уравнений, думаю, будет на порядок сложнее.[/p.s.]
К сообщению приложен файл: 9001570.xls (57.0 Kb)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 15.12.2017, 09:28
 
Ответить
Сообщениеperven, всё же это больше к алгебре будет...
[vba]
Код
Type point_
    X As Single
    Y As Single
End Type
Sub CrossPoint1()
Dim shp1 As Shape, line1 As Shape
Dim p1() As point_, p2(2) As point_
Dim po1() As Single
Dim count1 As Long
Dim K1 As Single, K2 As Single, d1 As Single, d2 As Single
Dim X As Single, Y As Single
Dim VF As Boolean, HF As Boolean
Dim diam As Single
Dim k As Integer
Set shp1 = ActiveSheet.Shapes("Полилиния 1")
Set line1 = ActiveSheet.Shapes("Прямая соединительная линия 8")
    With shp1.DrawingObject.ShapeRange.Nodes
        count1 = .Count
        ReDim p1(count1)
        For i = 1 To count1
            po1 = .Item(i).Points
            p1(i).X = po1(1, 1)
            p1(i).Y = po1(1, 2)
        Next i
    End With
    p2(1).X = line1.Left
    ' следующие свойства меняется при изменении положения отрезка в пространстве _
    (0-90: V=-1, H=0; 90-180: V=-1, H=-1; 180-270: V=0, H=-1; 270-360: V=0, H=0)
    VF = line1.DrawingObject.ShapeRange.VerticalFlip ' свойство меняется при изменении положения отрезка в пространстве
    HF = line1.DrawingObject.ShapeRange.HorizontalFlip ' свойство меняется при изменении положения отрезка в пространстве
    If VF = HF Then
        p2(1).X = line1.Left
        p2(1).Y = line1.Top
        p2(2).X = line1.Left + line1.Width
        p2(2).Y = line1.Top + line1.Height
    Else
        p2(1).X = line1.Left
        p2(1).Y = line1.Top + line1.Height
        p2(2).X = line1.Left + line1.Width
        p2(2).Y = line1.Top
    End If
    k = 10
    For i = 1 To count1 - 1
        K1 = (p1(i + 1).Y - p1(i).Y) / (p1(i + 1).X - p1(i).X)
        K2 = (p2(2).Y - p2(1).Y) / (p2(2).X - p2(1).X)
        d1 = (p1(i + 1).X * p1(i).Y - p1(i).X * p1(i + 1).Y) / (p1(i + 1).X - p1(i).X)
        d2 = (p2(2).X * p2(1).Y - p2(1).X * p2(2).Y) / (p2(2).X - p2(1).X)
        If (K1 <> K2) Then
            X = (d2 - d1) / (K1 - K2)
            Y = K1 * X + d1
        End If
        If belongs(X, Y, p1(i), p1(i + 1)) Then
            diam = 20 'диаметр кружков
            Set ff = ActiveSheet.Shapes.AddShape(msoShapeDonut, X - diam / 2, Y - diam / 2, diam, diam)
            ff.Line.ForeColor.RGB = RGB(255, 0, 0)
            k = k + 1
            Cells(k, 3) = X
            Cells(k, 4) = Y
        End If
    Next i
End Sub
Function belongs(X As Single, Y As Single, p1 As point_, p2 As point_) As Boolean
    Dim Xbool As Boolean
    Dim Ybool As Boolean
    If p1.X >= p2.X Then
        If X <= p1.X And X >= p2.X Then
           Xbool = True
        End If
    Else
        If X <= p2.X And X >= p1.X Then
           Xbool = True
        End If
    End If
    If p1.Y >= p2.Y Then
        If Y <= p1.Y And Y >= p2.Y Then
           Ybool = True
        End If
    Else
        If Y <= p2.Y And Y >= p1.Y Then
           Ybool = True
        End If
    End If
    belongs = Xbool And Ybool
End Function
[/vba]
[p.s.]Добавлю ещё, что макрос должен корректно работать только с фигурами, образованными прямыми линиям. Если рассматривать работу аналогичного макроса для криволинейных фигур, необходимо будет где-то получить информацию о том какие именно сплайны microsoft применяют тут (что-то беглый просмотр интернета этой информации мне не дал), и придётся решать уже систему нелинейных уравнений, думаю, будет на порядок сложнее.[/p.s.]

Автор - Roman777
Дата добавления - 14.12.2017 в 22:28
perven Дата: Четверг, 14.12.2017, 22:31 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
alex77755, ясно.

А как запустить-то этот макрос ?

Я его поставил в модуль листа. Но почему-то ничего не происходит.
К сообщению приложен файл: 345748-.xls (43.5 Kb)
 
Ответить
Сообщениеalex77755, ясно.

А как запустить-то этот макрос ?

Я его поставил в модуль листа. Но почему-то ничего не происходит.

Автор - perven
Дата добавления - 14.12.2017 в 22:31
perven Дата: Пятница, 15.12.2017, 21:29 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Roman777, все понятно.
Спасибо за точный ответ.
 
Ответить
СообщениеRoman777, все понятно.
Спасибо за точный ответ.

Автор - perven
Дата добавления - 15.12.2017 в 21:29
Roman777 Дата: Пятница, 15.12.2017, 23:30 | Сообщение № 11
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
perven, заметил, что раньше не увидел.
При вертикальном отрезке (стороне многоугольника или прямой, пересекающей его, будет ошибка, связанная с делением на ноль).
Пришлось в макрос CrossPoint1() внести изменения:


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Суббота, 16.12.2017, 09:17
 
Ответить
Сообщениеperven, заметил, что раньше не увидел.
При вертикальном отрезке (стороне многоугольника или прямой, пересекающей его, будет ошибка, связанная с делением на ноль).
Пришлось в макрос CrossPoint1() внести изменения:

Автор - Roman777
Дата добавления - 15.12.2017 в 23:30
perven Дата: Суббота, 16.12.2017, 13:17 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 67
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Roman777, понятно.
Спасибо за уточнение.
 
Ответить
СообщениеRoman777, понятно.
Спасибо за уточнение.

Автор - perven
Дата добавления - 16.12.2017 в 13:17
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2026 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!