Diskuze: C++ Vykreslení polygonu z vektoru souřadnic

C a C++ C a C++ C++ Vykreslení polygonu z vektoru souřadnic

Aktivity (1)
Avatar
Caster
Člen
Avatar
Caster:7. června 4:54

Program v C#

private void AddPolygonExample(PaintEventArgs e)
{

    // Create an array of points.
    Point[] myArray =
             {
                 new Point(23, 20),
                 new Point(40, 10),
                 new Point(57, 20),
                 new Point(50, 40),
                 new Point(30, 40)
             };

    // Create a GraphicsPath object and add a polygon.
    GraphicsPath myPath = new GraphicsPath();
    myPath.AddPolygon(myArray);

    // Draw the path to the screen.
    Pen myPen = new Pen(Color.Black, 2);
    e.Graphics.DrawPath(myPen, myPath);
}

Zkusil jsem:

Chci docílit: Převést kód do C++

 
Odpovědět 7. června 4:54
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7. června 10:01

google = cpp draw polygon

#include <iostream.h>
 #include <graphics.h>
 #include    <conio.h>
 #include     <math.h>
       int driver=VGA;
       int mode=VGAHI;
initgraph(&driver,&mode,"c:\\tc\\Bgi");
setcolor(15);
moveto(x0,y0);
lineto(x1,y1);
...
lineto(x0,y0);
# # #
VOID Example_DrawPolygon2(HDC hdc)
{
   Graphics graphics(hdc);

   // Create a Pen object.
   Pen blackPen(Color(255, 0, 0, 0), 3);

   // Create an array of PointF objects that define the polygon.
   PointF point1(100.0f, 100.0f);
   PointF point2(200.0f, 130.0f);
   PointF point3(150.0f, 200.0f);
   PointF point4(50.0f, 200.0f);
   PointF point5(0.0f, 130.0f);
   PointF points[5] = {point1, point2, point3, point4, point5};
   PointF* pPoints = points;

   // Draw the polygon.
   graphics.DrawPolygon(&blackPen, pPoints, 5);
}

https://msdn.microsoft.com/…=vs.85).aspx

 
Nahoru Odpovědět 7. června 10:01
Avatar
Caster
Člen
Avatar
Odpovídá na Peter Mlich
Caster:7. června 17:04

Díky, ale Visual Studio 2017 většinu příkazů a knihoven z příkladu výše vůbec nezná. Navíc tam chybí hlavní funkce Main. Nefunguje to.

 
Nahoru Odpovědět 7. června 17:04
Avatar
Odpovídá na Caster
Radek Chalupa:7. června 20:59

Ale zná, to jen kolega vzhledem k tomu že tohle je fórum C++, napsal příklad v C++ (v tomto případě pro windows a s využitím GDI+), takže buď to udělej v céčku nebo polož dotaz ve fóru věnovaném C# ;-)

 
Nahoru Odpovědět 7. června 20:59
Avatar
Radek Chalupa:7. června 21:06

PS: měl jsem samozřejmě na mysli pouze tu funkci Examle_DrawPolygon, to před tím není GUI pro windows, ale myslím nějaká borland knihovna pro kreslení do konzole..

 
Nahoru Odpovědět 7. června 21:06
Avatar
Caster
Člen
Avatar
Odpovídá na Radek Chalupa
Caster:7. června 21:21

V úvodu jsem psal, že mi jde o C++. Trochu jsem hledal dál a teď bych ještě doplnit asi za použití funkcí Windows API. Netušil jsem, že to je takové harakiri zobrazit v okně binární obrázek a vynést do něj trasy podle souřadnic.

 
Nahoru Odpovědět 7. června 21:21
Avatar
Odpovídá na Caster
Radek Chalupa:7. června 21:28

Takové harakiri to není, můžeš použít tu funkci od kolegy, akorát musíš vědět odkud ji zavolat, konkrétně nejspíš v obsluze zprávy WM_PAINT, aby tam ten výsledek byl "trvale", tj. provést to při každém požadavku na překreslení okna nebo jeho části.
Jinak v čistém WinAPI (bez GDI+) viz příklad zde: https://www.radekchalupa.cz/…se-winapi/14

 
Nahoru Odpovědět 7. června 21:28
Avatar
Caster
Člen
Avatar
Odpovídá na Radek Chalupa
Caster:7. června 21:45

Díky, vypadá to na dlouhé studium. Ideálně bych potřeboval odkaz na nějaký kompletní ukázkový příklad. O bitmapách jsem našel info zde Není tam ale příklad, jak to reálně použít v C++.

 
Nahoru Odpovědět 7. června 21:45
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8. června 11:26

V QT, je mozne pouzit ruzne funkce s ruznych knihoven. Jen musis vedet, jak ty knihovny pripojit k programu. Totez jiste jde ve VS.
Jinak, chtel jsem te naucit googlovat, jak postupovat v pripade, kdy chces pouzit funkci z jineho jazyka :)

google = cpp visual studio 2017 DrawPolygon
https://msdn.microsoft.com/…vs.110).aspx?…
https://msdn.microsoft.com/…=vs.71).aspx
https://msdn.microsoft.com/…=vs.85).aspx

 
Nahoru Odpovědět 8. června 11:26
Avatar
Caster
Člen
Avatar
Odpovídá na Peter Mlich
Caster:10. června 2:27

Jak to zamontovat kreslení polygonů do programu ?

// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

// Global variables

// The main window class name.
static TCHAR szWindowClass[] = _T("DesktopApp");

// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int CALLBACK WinMain(
        _In_ HINSTANCE hInstance,
        _In_ HINSTANCE hPrevInstance,
        _In_ LPSTR     lpCmdLine,
        _In_ int       nCmdShow
)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInstance;
        wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszMenuName = NULL;
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

        if (!RegisterClassEx(&wcex))
        {
                MessageBox(NULL,
                        _T("Call to RegisterClassEx failed!"),
                        _T("Windows Desktop Guided Tour"),
                        NULL);

                return 1;
        }

        // Store instance handle in our global variable
        hInst = hInstance;

        // The parameters to CreateWindow explained:
        // szWindowClass: the name of the application
        // szTitle: the text that appears in the title bar
        // WS_OVERLAPPEDWINDOW: the type of window to create
        // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
        // 500, 100: initial size (width, length)
        // NULL: the parent of this window
        // NULL: this application does not have a menu bar
        // hInstance: the first parameter from WinMain
        // NULL: not used in this application
        HWND hWnd = CreateWindow(
                szWindowClass,
                szTitle,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                500, 100,
                NULL,
                NULL,
                hInstance,
                NULL
        );

        if (!hWnd)
        {
                MessageBox(NULL,
                        _T("Call to CreateWindow failed!"),
                        _T("Windows Desktop Guided Tour"),
                        NULL);

                return 1;
        }

        // The parameters to ShowWindow explained:
        // hWnd: the value returned from CreateWindow
        // nCmdShow: the fourth parameter from WinMain
        ShowWindow(hWnd,
                nCmdShow);
        UpdateWindow(hWnd);

        // Main message loop:
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return (int)msg.wParam;
}

//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT ps;
        HDC hdc;
        TCHAR greeting[] = _T("Hello, Windows desktop!");

        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);

                // Here your application is laid out.
                // For this introduction, we just print out "Hello, Windows desktop!"
                // in the top left corner.
                TextOut(hdc,
                        5, 5,
                        greeting, _tcslen(greeting));
                // End application-specific layout section.

                EndPaint(hWnd, &ps);
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
                break;
        }

        return 0;
}
 
Nahoru Odpovědět 10. června 2:27
Avatar
Odpovídá na Caster
Radek Chalupa:10. června 7:39

Ve funkci WindowProc máš volání TextOut, místo toho tam jednoduše zavoláš tu výše zmíněnou funkci Example_drawPo­lygon2 s tím parametrem hdc.
Navíc pokud někde jinde v programu změníš ty data/body které chceš vykreslovat, zavoláš
RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
tím se vyvolá okamžité překreslení okna, tj. bude zavolána ta obsluha zprávy WM_PAINT.

 
Nahoru Odpovědět 10. června 7:39
Avatar
Caster
Člen
Avatar
Odpovídá na Radek Chalupa
Caster:10. června 22:08

Doplnil jsem tam ten polygon (ukázka z roku 2012...)

// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <graphics.h>
#include    <conio.h>
#include     <math.h>

// Global variables

// The main window class name.
static TCHAR szWindowClass[] = _T("DesktopApp");

// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int CALLBACK WinMain(
        _In_ HINSTANCE hInstance,
        _In_ HINSTANCE hPrevInstance,
        _In_ LPSTR     lpCmdLine,
        _In_ int       nCmdShow
)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInstance;
        wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszMenuName = NULL;
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

        if (!RegisterClassEx(&wcex))
        {
                MessageBox(NULL,
                        _T("Call to RegisterClassEx failed!"),
                        _T("Windows Desktop Guided Tour"),
                        NULL);

                return 1;
        }

        // Store instance handle in our global variable
        hInst = hInstance;

        // The parameters to CreateWindow explained:
        // szWindowClass: the name of the application
        // szTitle: the text that appears in the title bar
        // WS_OVERLAPPEDWINDOW: the type of window to create
        // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
        // 500, 100: initial size (width, length)
        // NULL: the parent of this window
        // NULL: this application does not have a menu bar
        // hInstance: the first parameter from WinMain
        // NULL: not used in this application
        HWND hWnd = CreateWindow(
                szWindowClass,
                szTitle,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                500, 100,
                NULL,
                NULL,
                hInstance,
                NULL
        );

        if (!hWnd)
        {
                MessageBox(NULL,
                        _T("Call to CreateWindow failed!"),
                        _T("Windows Desktop Guided Tour"),
                        NULL);

                return 1;
        }

        // The parameters to ShowWindow explained:
        // hWnd: the value returned from CreateWindow
        // nCmdShow: the fourth parameter from WinMain
        ShowWindow(hWnd,
                nCmdShow);
        UpdateWindow(hWnd);

        // Main message loop:
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return (int)msg.wParam;
}

VOID Example_DrawPolygon2(HDC hdc)
{
        Graphics graphics(hdc);

        // Create a Pen object.
        Pen blackPen(Color(255, 0, 0, 0), 3);

        // Create an array of PointF objects that define the polygon.
        PointF point1(100.0f, 100.0f);
        PointF point2(200.0f, 130.0f);
        PointF point3(150.0f, 200.0f);
        PointF point4(50.0f, 200.0f);
        PointF point5(0.0f, 130.0f);
        PointF points[5] = { point1, point2, point3, point4, point5 };
        PointF* pPoints = points;

        // Draw the polygon.
        graphics.DrawPolygon(&blackPen, pPoints, 5);
}

//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT ps;
        HDC hdc;
        TCHAR greeting[] = _T("Hello, Windows desktop!");

        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);

                // Here your application is laid out.
                // For this introduction, we just print out "Hello, Windows desktop!"
                // in the top left corner.
                TextOut(hdc,
                        5, 5,
                        greeting, _tcslen(greeting));
                // End application-specific layout section.

                EndPaint(hWnd, &ps);
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
                break;
        }

        return 0;
}

Ale Nezná to:
#include <graphics.h>

v apostrofech:
"Graphics" graphics(hdc);
"Pen" blackPen("Color"(255, 0, 0, 0), 3);
"PointF" point1(100.0f, 100.0f);

 
Nahoru Odpovědět 10. června 22:08
Avatar
Odpovídá na Caster
Radek Chalupa:10. června 22:19

podle všeho by to měly být třídy z GDI+, takže zkus
#include <gdiplus.h>
$pragma comment (lib, "gdiplus.lib")
a graphics.h vyhoď, to bude asi z té staré konzolové grafiky od borlandu

 
Nahoru Odpovědět 10. června 22:19
Avatar
Caster
Člen
Avatar
Odpovídá na Radek Chalupa
Caster:10. června 22:25

#include <gdiplus.h> to vzalo, nicméně na dalším řádku už ne tu pragmu, chyby stejné.
Celý kód stačí zkopírovat do Visual Studio 2017 jako desktop aplikaci a zkusit přeložit (po vložení té funkce Example_drawPo­lygon2)...

 
Nahoru Odpovědět 10. června 22:25
Avatar
Odpovídá na Caster
Radek Chalupa:10. června 22:38

měl jsem na mysli visual studio nebo nějaké ide/kompilátor které umí windows sdk, ta knihovna gdiplus.lib je ve windows sdk a kompatibilní s microsoft kompilátorem, resp. linkerem

 
Nahoru Odpovědět 10. června 22:38
Avatar
Caster
Člen
Avatar
Odpovídá na Radek Chalupa
Caster:10. června 22:48

Moc se v tom nevyznám. Mám instalován "Visual Studio 2017", které na běžné věci funguje zcela bez problémů viz ukázkový příklad vytvoření okna výše. Netuším, kde bych v něm měl ověřit, ža tam je nějaké ide...

 
Nahoru Odpovědět 10. června 22:48
Avatar
Caster
Člen
Avatar
Caster:29. července 0:29

Nějaká rada, ideálně ukázkový příklad, jak nakreslit polygon podle bodů se souřadnicemi v okně pomocí C++ a Visual Studia 2017 ? Případně tip na nějakou novou knihu s příklady grafiky, kde se to mohu naučit.

 
Nahoru Odpovědět 29. července 0:29
Avatar
Caster
Člen
Avatar
Caster:4. srpna 1:07

Vyřešeno, použil jsem funkci Polyline(hdc, apt, count);

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 4. srpna 1:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.