Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дайте пример функции для рисования Dashed Line / 11 сообщений из 11, страница 1 из 1
17.04.2019, 11:03
    #39802586
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
Приветствую, нужна функция для рисования Dashed Line (линии из черточек), в которой я бы мог изменять размер черточек и расстояния между ними. Стандартный TCanvas не умеет, у него заранее определенные значения. Желательно без использования Windows-специфичных функций :)
...
Рейтинг: 0 / 0
17.04.2019, 11:11
    #39802592
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
20 долларов/час, и я тебе напишу такую функцию
...
Рейтинг: 0 / 0
17.04.2019, 11:16
    #39802599
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
Квейд,

Написать я и сам могу, думал может у кого есть готовые примеры или хотя бы алгоритм, дабы не рыться самому.
...
Рейтинг: 0 / 0
17.04.2019, 11:38
    #39802630
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
I dont know, так взлетит?

How to draw custom dashed/dotted lines on a canvas.
https://edn.embarcadero.com/article/26475
...
Рейтинг: 0 / 0
17.04.2019, 11:50
    #39802658
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
КвейдI dont know, так взлетит?Что-то ссылка не открылась. А вообще, это элементарно делается через GDI+. В наших компонентах такое используется.
...
Рейтинг: 0 / 0
17.04.2019, 12:15
    #39802677
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
Квейд,
Эту ссылку находил, не открывается. Сейчас медитирую над Брезенхемом и Ву...
...
Рейтинг: 0 / 0
17.04.2019, 12:45
    #39802710
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
I dont know,
TCanvas умеет: ExtCreatePen
(Какие-то вещи удобнее с LineDDA)

https://stackoverflow.com/questions/13789474/draw-a-line-on-canvas-with-custom-style-delphi
...
Рейтинг: 0 / 0
17.04.2019, 12:56
    #39802725
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
MBo,

Это GDI-ая функция, не по феншую (
...
Рейтинг: 0 / 0
17.04.2019, 13:12
    #39802743
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
white_niggerКвейдI dont know, так взлетит?Что-то ссылка не открылась. А вообще, это элементарно делается через GDI+. В наших компонентах такое используется.

а я смог :) http://webcache.googleusercontent.com/search?q=cache:ImWkc31QcngJ:https://edn.embarcadero.com/article/26475&hl=de&gl=de&strip=1&vwsrc=0


How to draw custom dashed/dotted lines on a canvas.

By: Vincent Drake

Abstract: Describes the use of ExtCreatePen to customize the length of your dotted lines.

Question:

Can I create custom dotted and dashed lines when drawing to the canvas? The Pen styles psDashed and psDotted don't look right for my purposes.

Answer:

The VCL doesn't directly provide this function, but it is available to you through the Windows API function ExtCreatePen. The following example demonstrates the use of this function. The example creates a pen with a dash pattern that incrementally gets longer. The created pen handle is then assigned to the canvas pen, then the line is drawn.

Example:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        LOGBRUSH lbrush = { BS_SOLID, RGB(0,0,0), NULL};
        DWORD userstyle[] = {2, 2, 4, 4, 8, 8, 16, 16, 32, 32};

        Canvas->Pen->Handle = ExtCreatePen(PS_COSMETIC | PS_USERSTYLE, 1, &lbrush, 10, userstyle);
        Canvas->MoveTo(0, 0);
        Canvas->LineTo(400, 400);
}
...
Рейтинг: 0 / 0
17.04.2019, 13:51
    #39802784
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
Кроик Семён,

ему руками надо. В битовой карте, без обращения к ОС.
...
Рейтинг: 0 / 0
17.04.2019, 14:07
    #39802807
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дайте пример функции для рисования Dashed Line
Пока, с помощью интернетов и небольших раздумий набросал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
procedure TForm1.DrawLine(c : TCanvas; x1,y1,x2,y2 : Integer);
var
    dx, dy, s, sx, sy, err, e2: integer;
    ds, es, i, j : integer;
    procedure _swap(out a, b : integer);
    var
        t : integer;
    begin
        t := a;
        a := b;
        b := t;
    end;
begin

    ds := 5; // dash size
    es := 2; // empty size

    if x1 > x2 then
    begin
        _swap(x1, x2);
        _swap(y1, y2);
    end;

    dx := abs(x2 - x1);
    dy := -abs(y2 - y1);

    if x1 < x2 then sx := 1 else sx := -1;
    if y1 < y2 then sy := 1 else sy := -1;
    err := dx+dy;

    i := 0;
    j := 0;
    while x1 < x2 do begin
        if i <= ds then begin
            c.Pixels[x1, y1] := clBlack;
            inc(i);
        end
        else begin
            if j = es then begin
                i := 0;
                j := 0
            end
            else
                inc(j);
        end;

        e2 := 2*err;

        if (e2 >= dy)  then begin
            err := err + dy;
            x1 := x1 + sx;
        end; // e_xy+e_x > 0

        if (e2 <= dx) then begin
            err := err + dx;
            y1 := y1 + sy;
        end; // e_xy+e_y < 0
    end;
end;                                                        



Корявенько и есть проблемы с пустотами между черточками, но в первом приближении пойдёт )
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дайте пример функции для рисования Dashed Line / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]