Avatar billede zer0c00l Juniormester
22. maj 2006 - 14:04 Der er 9 kommentarer og
1 løsning

Tegne graf i C++

Hej eksperter..

Jeg har en .txt fil, som henter informationer fra en microcontroller. Dataene i .txt filen er linet op i en række som nedenfor vist:

23
32
45
(osv.)

Kun talværdier!

Jeg skal have lavet en graf over disse værdier i c++, men er ikke klar over, hvordan jeg skal gribe det an.

Jeg har forsøgt med to løsninger. En med MS Excel og en med OpenGL.

Problemet med MS Excel-løsningen er, at jeg ikke kan få programmet til at lave grafen for mig. Det er ikke noget problem at få tallene flyttet fra .txt filen til Excel.

Hvordan kan jeg lave en funktion i C++, der automatisk laver grafen for mig, når jeg starter programmet?

Problemet med OpenGL er, at jeg ikke kan lave en kurve. Jeg kan tage informationerne fra min .txt fil og lave et cirkeldiagram (pie chart) og et søjlediagram (bar chart), men ingen ”line chart”?

Der tages imod svar på begge metoder (eller en helt tredje) med kyshånd. Jeg er på dybt vand :(
Avatar billede lars314 Nybegynder
22. maj 2006 - 14:42 #1
Du bliver vel nød til at opfinde et sæt x-koordinat værdier. Feks

x  y
1 23
2 32
3 45
(osv.)
Avatar billede zer0c00l Juniormester
22. maj 2006 - 14:43 #2
Det er intet problem at skrive tal til MX Excel. Men jeg kan stadig ikke lave en graf!
Avatar billede zaknafein Praktikant
22. maj 2006 - 14:44 #3
Du kan måske kalde et graf værktøj som fx GnuPlot fra c++ med de parametre.
Eller også kan du bare selv tegne de linier du skal tegne i en dialog.

Vil du selv tegne dem, eller skal et værktøj gøre det for dig?

Som dine data ser ud nu ligner det at du bare skal have søjle diagrammer. Du har kun 1 dimension.
Mon ikke du også har en y dimensioner i din data?
Avatar billede zaknafein Praktikant
22. maj 2006 - 14:57 #4
Bruger du .net framework, MFC, eller kun win 32?
Avatar billede zer0c00l Juniormester
22. maj 2006 - 15:07 #5
Jeg skal bare bruge svar til enten MFC eller Win32 :)
Avatar billede zaknafein Praktikant
22. maj 2006 - 15:14 #6
Hvad svarer du mht. dimensionerne?
Og til om et eksternt program må generere din graf?

I en ren win32 kan du tegne simple linier med
dc.MoveTo(m_StartPoint);
dc.LineTo(m_EndPoint);
Avatar billede zer0c00l Juniormester
22. maj 2006 - 15:18 #7
Nej, det er ikke et søjlediagram, jeg skal have fat i.. x-aksen er tiden, og y-aksen er en registreret kraftpåvirkning (tallene fra .txt filen). Der skal bare være konstante værdier på x aksen.....
Avatar billede bertelbrander Novice
26. maj 2006 - 00:29 #8
Du kunne starte med noget i stil med:

#include <windows.h>
#include <vector>
#include <fstream>

HINSTANCE InstanceHandle;
HWND      MainWindow;

std::vector<int >DataSet;

void Draw(HDC aDc)
{
  RECT ClientRect;
  GetClientRect(MainWindow, &ClientRect);
  int Height = ClientRect.bottom - ClientRect.top;
  int Width = ClientRect.right - ClientRect.left;
  int n;
  for(n = 0; n < Width && n < DataSet.size(); n++)
  {
      SetPixel(aDc, n, Height - 1 - DataSet[n], RGB(255, 0, 0));
  }
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
  case WM_DESTROY:
      PostQuitMessage(0);
      break;
  case WM_PAINT:
      {
        PAINTSTRUCT PaintStruct;
        HDC dc = BeginPaint(hwnd, &PaintStruct);
        Draw(dc);
        EndPaint(hwnd, &PaintStruct);
      }
      break;
  default:
      return DefWindowProc(hwnd,msg,wParam,lParam);
  }
  return 0;
}

HWND CreateMainWindow()
{
  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW  | CS_DBLCLKS ;
  wc.lpfnWndProc = (WNDPROC )MainWndProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_WINDOW + 1);
  wc.lpszClassName = "SimpleWinWndClass";
  wc.lpszMenuName = 0;
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  if(!RegisterClass(&wc))
      return 0;

  return CreateWindow("SimpleWinWndClass",
                      "Simple-Window",
                      WS_MINIMIZEBOX | WS_VISIBLE |
                      WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX |
                      WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_THICKFRAME,
                      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                      0,
                      0,
                      InstanceHandle,
                      0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR aCmdLine, INT)
{
  InstanceHandle = hInstance;
  if(aCmdLine && aCmdLine[0])
  {
      std::ifstream InFile(aCmdLine);
      if(!InFile)
      {
        MessageBox(0, "Failed to open your file", "Plotter", MB_OK);
        return 1;
      }
      int V;
      while(InFile >> V)
        DataSet.push_back(V);
  }

  if((MainWindow = CreateMainWindow()) == (HWND )0)
  {
      MessageBox(0, "Failed to create MainWindow!", "Warning", MB_OK);
      return 0;
  }
  ShowWindow(MainWindow, SW_SHOW);
  MSG Msg;
  while(GetMessage(&Msg, 0, 0, 0))
  {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
  }
  return Msg.wParam;
}
Avatar billede zer0c00l Juniormester
26. maj 2006 - 00:36 #9
Hold da kæft :D

Tjekker det lige i morgen! Mange tak!

Haha "Du kunne starte med noget i stil med:", og så kommer der 80 siders kode.. Priceless
Avatar billede zer0c00l Juniormester
19. juni 2006 - 12:07 #10
hmm kunne ikke få det til at virke, så droppede det.. :/ ellers tak for jeres svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester