Что нового

Распарсить файл рисунка из линий и нарисовать (например в paint) используя 3 цвета

flud

Новичок
Сообщения
2
Репутация
0
есть данный текстовый файл (можно его упростить в формат csv)

1:(-7, -9)(8, -8):1 2:(8, -8)(8, 8):1 3:(8, 8)(-8, 8):1 4:(-8, 8)(-8, -8):1 5:(16, 8)(16, -24):2 6:(16, -24)(48, -24):2 7:(48, -24)(48, 8):2 8:(48, 8)(16, 8):2 9:(56, 8)(56, -56):3 10:(56, -56)(120, -56):3 11:(120, -56)(120, 8):3 12:(120, 8)(56, 8):3

первый символ, номер линий
: находятся координаты линий относительно центра :
последняя цифра означает виртуальный цвет, на данный момент их только 3

Godot.png
то что должно получиться, как видно в первом белом квадрате находиться центр
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GDIPlus.au3>

$DataFile = @ScriptDir & "\data.txt" ; файл с данными
$PicFile  = @ScriptDir & "\pic.png"  ; файл картинки (результат)

Global $W = 300, $H = 250 ; размер картинки
Global $X = 100, $Y = 150 ; координаты центра
Global $Colors[] = [0xFF0E0E0E,0xFFFFFFFF,0xFF1FFF17,0xFFFE00FE] ; [0] фон, [1] цвет 1, [2] цвет 2 ...
Global $PenLine = 2 ; толщина линии

; парсер
$Text = FileReadToArray($DataFile)
Global $Data[UBound($Text)][6]
For $i = 0 To UBound($Text) - 1
  $a = StringRegExp($Text[$i], "-?\d+", 3)
  If UBound($a) <> 6 Then Exit MsgBox(0, "Error", "Некорректный формат данных" & @CRLF & "Строка: " & $i + 1)
  For $j = 0 To 5
    $Data[$i][$j] = $a[$j]
  Next
  If $Data[$i][5] < 0 Or $Data[$i][5] >= UBound($Colors) Then $Data[$i][5] = 0
Next

; картинка
_GDIPlus_Startup()
$Img = _GDIPlus_BitmapCreateFromScan0($W, $H)
$Gra = _GDIPlus_ImageGetGraphicsContext($Img)
_GDIPlus_GraphicsClear($Gra, $Colors[0])
$Pen = _GDIPlus_PenCreate(0xFFFFFFFF)
_GDIPlus_GraphicsDrawRect($Gra, $X - 1, $Y - 1, 1, 1, $Pen)
_GDIPlus_PenSetWidth($Pen, $PenLine)
For $i = 0 To UBound($Data) - 1
  _GDIPlus_PenSetColor($Pen, $Colors[$Data[$i][5]])
  _GDIPlus_GraphicsDrawLine($Gra, $X + $Data[$i][1], $Y + $Data[$i][2], $X + $Data[$i][3], $Y + $Data[$i][4], $Pen)
Next
_GDIPlus_ImageSaveToFile($Img, $PicFile)
_GDIPlus_PenDispose($Pen)
_GDIPlus_ImageDispose($Img)
_GDIPlus_GraphicsDispose($Gra)
_GDIPlus_Shutdown()

ShellExecute($PicFile)
 
  • Like
Реакции: flud
Автор
F

flud

Новичок
Сообщения
2
Репутация
0
Код:
#include <AutoItConstants.au3>

HotKeySet("{ESC}", "Terminate")
HotKeySet("{F1}", "StartDrawing")

$DataFile = @ScriptDir & "\exported.txt" ; файл с данными
Global $bStopLoop = False
Global $Center = 121 ; координаты центра
Global $scaleFactor = 0.605;
Global $Colors[] = [0xFF0E0E0E,0xFFFFFFFF,0xFF1FFF17,0xFFFE00FE] ; [0] фон, [1] цвет 1, [2] цвет 2 ...

$Text = FileReadToArray($DataFile)
Global $vectors[UBound($Text)][6]
 For $i = 0 To UBound($Text) - 1
 $a = StringRegExp($Text[$i], "-?\d+", 3)
 If UBound($a) <> 6 Then Exit MsgBox(0, "Error", "Некорректный формат данных" & @CRLF & "Строка: " & $i + 1)
 For $j = 0 To 5
 $vectors[$i][$j] = $a[$j]
 Next
 If $vectors[$i][5] < 0 Or $vectors[$i][5] >= UBound($Colors) Then $vectors[$i][5] = 0
 Next

While 1
Sleep(100)
WEnd

Func StartDrawing()
      
    Global $CurrentPositionX = MouseGetPos(0)
    Global $CurrentPositionY = MouseGetPos(1)

    ; Loop over vector arrays and draw lines with MouseClickDrag
    For $i = 0 To UBound($vectors) - 1

        ; Get starting and ending coordinates of line segment
        Local $scaledX1 = $vectors[$i][1] *  $scaleFactor
        Local $scaledY1 = $vectors[$i][2] *  $scaleFactor
        Local $scaledX2 = $vectors[$i][3] *  $scaleFactor
        Local $scaledY2 = $vectors[$i][4] *  $scaleFactor
        
        Local $cursorX = $CurrentPositionX
        Local $cursorY = $CurrentPositionY
        
        Local $absoluteX1 = $cursorX + $scaledX1;
        Local $absoluteY1 = $cursorY + $scaledY1;
        Local $absoluteX2 = $cursorX + $scaledX2;
        Local $absoluteY2 = $cursorY + $scaledY2;
                
        ; Click and drag the mouse to draw the line segment
        MouseClickDrag("left", $absoluteX1, $absoluteY1, $absoluteX2, $absoluteY2)
        
    If $bStopLoop Then
        ExitLoop ; exit the loop when the flag is set to True
    EndIf
        
    Next
EndFunc

Func Terminate()
    $bStopLoop = Not $bStopLoop
    Exit
EndFunc   ;==>Terminate


есть идеи как улучшить ? например ускорить работу, а лучше добавить возможность тонко регулировать скорость ?

Код:
1,-59,278,-59,278,1
2,-2,-2,-2,2,1
3,-2,2,2,2,1
4,2,2,2,-2,1
5,2,-2,-1,-2,1
6,-7,-7,-7,7,1
7,-7,7,7,7,1
8,7,7,7,-7,1
9,7,-7,-7,-7,1
10,-11,-11,-11,11,1
11,-11,11,11,11,1
12,11,11,11,-11,1
13,11,-11,-11,-11,1
14,-16,-16,-16,16,1
15,-16,16,16,16,1
16,16,16,16,-16,1
17,16,-16,-16,-16,1
18,8,-24,24,-24,1
19,24,-24,24,-8,1
20,24,8,24,24,1
21,24,24,8,24,1
22,-8,24,-24,24,1
23,-24,24,-24,8,1
24,-24,-8,-24,-24,1
25,-24,-24,-8,-24,1
 

Вложения

  • Transformice.png
    Transformice.png
    9.1 КБ · Просмотры: 5
Верх