Форум: "Прочее";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизМожно ли в .NET малой кровью получить регион Найти похожие ветки
← →
default © (2007-01-23 17:27) [0]для линии рисуемой пером заданной толщины?
← →
Skier © (2007-01-23 17:30) [1]может речь о пути идёт ?
← →
default © (2007-01-23 17:35) [2]Skier © (23.01.07 17:30) [1]
именно регион
в одном примере по алгоритму некоему(возможно Брезенхама) все пиксели прямой пробегают и для них получаю прямоуголники их охватывающие и эти прямоугольники потом объелиняют в регион
но вот хотелось бы проще
вот проверить попадает-ли точка в прямую нарисованную пером заданной толщины можно через IsOutlineVisible, а вот регион создать нету
← →
default © (2007-01-23 17:39) [3]в принципе, для отрезка прямой просто это сделать, загнав в объект "GraphicsPath" отрезки прямых выше и ниже данной соединить по концам, например, вертикальными отрезками и по пути получить регион
но нужно и для ломаных, а для ломаных подобное рисование "полоски" сложнее, а в перспективе неплохо было получать регионы и для кривых
← →
Stexen © (2007-01-23 17:41) [4]
> для линии рисуемой пером заданной толщины?
Что то я задачи немного не понял!
← →
default © (2007-01-23 17:47) [5]Stexen © (23.01.07 17:41) [4]
вот если ты нарисуешь букву W используя четыре отрезка прямых и нарисуешь эти отрезки пером толщины, например, 5 ты увидишь толстенную букву W(при не сильно большой разрешении и настройках по умолчанию остальных), вот нужно получить регион для области которую занимает эта буква дабл ю
← →
Stexen © (2007-01-23 17:53) [6]Всмысле magic wand или что?А кажется понял о чем ты, сейчас вспомню как это делается. Делал я это чудо маской сто пудово!То есть берем область которую примерно занимает буква w примерно так
--
|w|
--
И превращаем ее в двухцветную маску. Далее используя MaskBlt(если память не изменяет делаем что надо с этой областью).
Или я опять что то не так понял?
Ну по крайней мере для работы с magic wand подходило нормально и работало быстро, если ничего не путаю.... Жаль на работе нет исходников своей програмулины
← →
default © (2007-01-23 18:02) [7]Stexen © (23.01.07 17:53) [6]
хз
я не понял
а ты в своём редакторе какой подход использовал при перерисовке графическх объектов? перерисовывал всю диаграмму с использованием двойной буферизации для отмены моргания или перерисовывал только то что надо использую регионы(ну или хотя бы просто прямоугольники, главно что не всё подряд) ?
← →
Stexen © (2007-01-23 18:15) [8]
> а ты в своём редакторе какой подход использовал при перерисовке
> графическх объектов? перерисовывал всю диаграмму с использованием
> двойной буферизации для отмены моргания или перерисовывал
> только то что надо использую регионы(ну или хотя бы просто
> прямоугольники, главно что не всё подряд) ?
Смотря для каких целей, например при перетаскивани картинки целиком отрисовывал полностью всю видимую зону, почти во всем остальном перерисовывал изменяемую зону прямоуголником, ибо вяснилось опытным путем что высчитывать все регионы маски и тд займет больше времени чем перерисовать тупо прямоугольник, хотя вот для векторной графики я думаю нет смысла так делать!А цель твоего редактора какая если не секрет?
← →
default © (2007-01-23 18:33) [9]Stexen © (23.01.07 18:15) [8]
некая смесь ERwin и RationalRose
а про цель не скажу:)
> ибо вяснилось опытным путем что высчитывать все регионы
> маски и тд займет больше времени чем перерисовать тупо прямоугольник
вот и я этого боялся
кстати, ты меня прежним постом натолкнул на решении
как думаешь неплохо такое?например, имеем поверхность прямоугольную ограничивающую нашу фигуру
все пиксели этой поверхности имею одинаковый цвет
рисуем нашу фигуру в этой ограничивающей поверхности
и пробегаемся по пикселям с цветом нашей фигуры
в .NET минимальный прямоугольник это 2*2 пикселя - это минимальный прямоугольник по которому можно создать регион
вот такими прямоугольниками можно в ТОЧНОСТИ АППРОКСИМИРОВАТЬ нашу фигуру ну и по ним создать регион потом путём объединения
← →
default © (2007-01-23 18:37) [10]хотя не в точности будет, но близко очень
я хотел бы вообще один в один получать...но это так, это тоже неплохо
← →
default © (2007-01-23 18:42) [11]почему же штатных средств нету...гадство
до IsoutlineVisible ведь додумались!
← →
Stexen © (2007-01-23 18:46) [12]
> хотя не в точности будет, но близко очень
> я хотел бы вообще один в один получать...но это так, это
> тоже неплохо
Идея оч.хорошая, но у меня первый вопрос: ты как бы из нескольких маленьких регионов будешь создавать один большой???или будешь перерисовывать каждый из них по очереди???В последнем случае по моему не особо хорошо получится, в первом все супер!Однако, встречный вопрос у меня раз у тебя будет известен цвет фигуры и цвет бэкграунда, то грубо говоря у тебя есть готовая маска!!!И используя MaskBlt ты можешь в точности перерисовать нужную тебе под фигуру область!!!!Если не очень ясно объясняю, то могу кинуть пример на мыло, если оставишь и только вечером после 10.Мне кажется он тебе подойдет!
> некая смесь ERwin и RationalRose
Ну я это и хотел узнать!
← →
default © (2007-01-23 18:58) [13]Stexen © (23.01.07 18:46) [12]
> в первом все супер
ага, он, первый
> используя MaskBlt ты можешь в точности перерисовать нужную
> тебе под фигуру область!!!!Если не очень ясно объясняю,
> то могу кинуть пример на мыло, если оставишь и только вечером
> после 10.Мне кажется он тебе подойдет!
цвета можно считать известными
вот смотри, представь кривую линию какую-нить заковыристую
и её смещают вниз
область инвалидации равна при этот объединению регионов занимаемых первоначальным и новым положением кривой(прямоугольниками задавать регионы занимаемые кривыми как-то неэкономно)
я смогу получить сделать такое с помощью MaskBlt?
← →
default © (2007-01-23 19:06) [14]
> прямоугольниками задавать регионы занимаемые кривыми как-
> то неэкономно
или сделать прямоугольником и не париться...вот хрен его знает...
← →
default © (2007-01-23 19:08) [15]может поэтому и есть только в .NET возможность узнать попадает ли точка в кривую заданной толщины, а получения региона для неё нету
может специально это, чтобы руки не чесались усложнять простое?
← →
Stexen © (2007-01-23 19:14) [16]
> вот смотри, представь кривую линию какую-нить заковыристую
> и её смещают вниз
> или сделать прямоугольником и не париться...вот хрен его
> знает...
Не, погоди, не надо делать прямоугольником(одним), раз такой расклад!!!Давай мыло? скину тебе пример про маскблт, он спецом для этого и сделан я думаю!!! :)Мне кажется все равно быстрее будет чем анализировать фигуры по маленьким прямоугольничкам(это у меня сразу с интегралами ассоциируется, плохие воспоминания:) )Да и нервов и времени меньше займет!
← →
default © (2007-01-23 19:16) [17]Stexen © (23.01.07 19:14) [16]
sudamnepishut@mail.ru
заранее спасибо, посмотрю отвечу
← →
Stexen © (2007-01-23 19:18) [18]
> sudamnepishut@mail.ru
> заранее спасибо, посмотрю отвечу
часов в 11 скину...
← →
default © (2007-01-23 19:31) [19]Stexen © (23.01.07 19:18) [18]
на всякий
у меня примерно идеология такая
диаграмма сообщает графическим объектам разные события типа кликов мыши, движения мыши и тд
графоб получил событий и , возможно, ему потребовалось переисовать себя в соответствии с этим событием и он тогда сообщает диаграмме что такой-то регион диаграммы стал инвалидным и форма в соответствии с какими-то своим алгоритмов потом перерисовывает инвалидный регион вызывая методы Paint у графоб(то ли у всех то ли тем кому действительно нужно перерисовать и тд уже решаем диаграмма, нас это не волнует)
вот если брать линию
когда она поняла что её смещают ей надо отрисовать себя в новом положении и она понимает что после ухода её с прежнего места графобъекты которые находились под ней должны перерисоваться сеья в инвалидных кусках и она поэтому сообщает диаграмме регион инвалидации как объединении региона её нынешнего положения и прежнего
точно подойдёт твой метод?
← →
Stexen © (2007-01-23 19:34) [20]
> точно подойдёт твой метод?
Я думаю, да, но если что посовещаемся!А тебе что завтра проект уже сдавать?
← →
default © (2007-01-23 19:36) [21]Stexen © (23.01.07 19:34) [20]
да нет
ok, посовещаеся!
← →
default © (2007-01-24 21:46) [22]Stexen © (23.01.07 19:34) [20]
да что-то медленно тем способом что предлагал
но самое удивительное что тормозит именно GetPixel
GetPixel для сетки 100x100 на пикселов с тормозами - удивительно
Private Function GetLineRegion(ByVal pen As Pen, ByVal p1 As Point, ByVal p2 As Point) As Region
Dim bmp As New Bitmap(100, 100)
Dim grfx As Graphics = Graphics.FromImage(bmp)
Dim gp As New GraphicsPath
grfx.DrawLine(p, p1, p2)
For i As Integer = 0 To bmp.Width - 1
For j As Integer = 0 To bmp.Height - 1
If bmp.GetPixel(i, j).ToArgb = pen.Color.ToArgb Then
gp.AddRectangle(New Rectangle(i, j, 1, 1))
End If
Next
Next
Dim r As New Region(gp)
gp.Dispose()
grfx.Dispose()
bmp.Dispose()
Return r
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
g.DrawLine(p, 0, 0, 50, 50)
g.FillRegion(Brushes.Green, GetLineRegion(p, New Point(0, 0), New Point(50, 50)))
End Sub
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.084 c