Προς το περιεχόμενο

Κωδικας για κυκλο σε c.


deepspacegr

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα και παλι.Υπαρχει μηπως διαθεσιμος καποιος κωδικας σε c για να φτιαξω εναν τελειο κυκλο;Θα το εκτιμουσα ιδιαιτερα γιατι ολο αυτο το καιρο που διαβαζω

οταν θελω να χαλαρωσω προσπαθω να βρω απο το internet κατι που να δουλευει αλλα τζιφος.

Μου εχει γινει εμμονη ιδεα.

Δημοσ.

Εχεις δικιο.Εννοω απλα κυκλο,και οχι κυκλικο σχημα.

Πχ#include<stdio.h>

#include<windows.h>

 

 

main()

{

int i, j;

int n1, n2;

double apo;

i=n1;

j=n2;

apo=(i*i+j*j)/-1000000;

 

HANDLE hConsole;

hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

 

for(i = -20; i < 20; i++)

{

for(j = -20; j < 20; j++)

{

if(i*i+j*j ==29)

{

SetConsoleTextAttribute(hConsole,22);

printf("");}

 

 

 

 

 

else

 

SetConsoleTextAttribute(hConsole,99);

printf("*");}

 

printf("\n");

 

 

}

system("pause");

return 0;

}

Δημοσ.
There's only one problem: natively, C does not provide graphics capabilities!!

 

"ενημερώσου" για το "πρόβλημά σου" μέχρι να απαντήσει κάποιος ειδήμων στο θέμα !

 

http://www.friedspace.com/cprogramming/cgraphics.php

 

http://www.thefreecountry.com/sourcecode/graphics.shtml

http://spdg1.sci.shizuoka.ac.jp/grwinlib/english/

http://en.wikipedia.org/wiki/GTK%2B

http://www.tcl.tk/software/tcltk/

http://en.wikipedia.org/wiki/Tk_(computing)

 

.

Δημοσ.

Δυστυχώς γραφικά σε mode σχεδίασης εικόνας, η ANSI-C δεν παρέχει, για αυτό θα πρέπει είτε να αρκεστείς σε ANSI γραφικά (γνωστά παλαιότερα και ως block graphics) είτε θα πρέπει να χρησιμοποιήσεις κάποια βιβλιοθήκη γραφικών.

 

Σε εποχή MS-DOS για παράδειγμα, μπορούσες να χρησιμοποιήσεις την βιβλιοθήκη graph.h που προσέφερε η Microsoft C 6.0 ή την ανάλογη βιβλιοθήκη που προσέφερε ο Borland Turbo C++ compiler ώστε να γυρίσεις την κάρτα γραφικών σου σε mode γραφικών ώστε ύστερα με την ανάλογη ρουτίνα τους να σχεδιάσεις το σχήμα που ήθελες.

Σήμερα το ίδιο μπορείς να κάνεις με την βοήθεια των GDI εντολών που προσφέρουν τα MS-Windows, αλλά εδώ απαιτείται ένα DC, δηλαδή ένα Device Context (ας το πούμε “surface” για να το καταλάβεις καλύτερα), ενός παραθύρου, μάλιστα αν ψάξεις στο δίκτυο μπορείς να βρεις κάποια παραδείγματα που δοκιμάζουν να σχεδιάσουν τέτοια γραφικά στην Console -“βιάζοντας” ως έναν βαθμό το Σύστημa.

 

Τώρα, επί του προκείμενου, αν θες ένα απλό ANSI σχήμα που να ομοιάζει ως έναν βαθμό με κύκλο ή καλύτερα με ένα Round-Rectangle, μπορείς να δεις το παρακάτω κώδικα γραμμένο σε CodeGear Turbo C Explorer 2006, είναι μια απλή, σύντομη λύση (ήμουν περίεργος να δω αν θα μπορούσα να το γράψω όσο πιο compact μπορούσα).

 

Τοποθετούμε Χ κενά στην γραμμή μας που αποτελείται από Width (πλάτος) χαρακτήρες ʽΟʼ, ύστερα για να την κάνουμε πιο round αφαιρούμε τον πρώτο και τον τελευταίο χαρακτήρα της πρώτης & τελευταίας γραμμής και φροντίζουμε να εκτυπώσουμε Y φορές \n ώστε η σχεδίαση να ξεκινήσει από το Y που θέλουμε. Για να διατηρήσουμε κενό το εσωτερικό του σχήματος διαγράφουμε τους χαρακτήρες από τον δεύτερο μέχρι τον προτελευταίο (memset -2) για αυτό υποθέτουμε ότι το ελάχιστο Width μας είναι το 2. Τέλος εκτυπώνουμε το εσωτερικό του σχήματος Height (ύψος) φορές (nYCount).

 

>
/*-Simple lame ANSI C Circle like shape function (c) Directx-----------------*/

#include <stdio.h>
#include <string.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
int 	_AnsiCircle(int X,int Y,int Width,int Height);

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
_AnsiCircle(30,5,20,10);

getchar();
return 0;
}
/*---------------------------------------------------------------------------*/
int		_AnsiCircle(int X,int Y,int Width,int Height)
{
int nYCount;
char szLine[bUFSIZ] = "";

/* Sanity check, Width should be >=2 else memset -2 fails */
if(Width<2)
	return	0;

/* Move stdout output Y \n lines to print Circle on Y */
memset(&szLine,'\n',Y);
printf("%s\n",szLine);

/* Apply the neccesary spaces X times to print Circle on X */
memset(&szLine,' ',X);

/* Draw the top part of the Circle */
memset(&szLine[X],'O',Width);	
szLine[X]=' '; szLine[X+Width-1]=' ';
printf("%s\n",szLine);
szLine[X]='O'; szLine[X+Width-1]='O';
/* Draw the interior part of the Circle */
memset(&szLine[X+1],' ',Width-2);
for(nYCount=0;nYCount<Height;nYCount++)
	printf("%s\n",szLine);
/* Draw the bottom part of the Circle */
memset(&szLine[X+1],'O',Width-2);
szLine[X]=' '; szLine[X+Width-1]=' ';
printf("%s\n",szLine);

/* We draw something on stdout!! */
return	1;
}

 

Και ένα οπτικό δείγμα, για να μην ταλαιπωρείσαι τζάμπα αν δεν σε ενδιαφέρει:

 

4lken9e6geknml852694.png

 

Καλή συνέχεια.

 

Υ.Γ.

Το BUFSIZ είναι stdio.h constant στα 512bytes (άρα καλύπτει ένα μεγάλο εύρος τιμών για το πείραμα μας).

Δημοσ.

Και μιας και το ανέφερε ο DirectX να και ένα παράδειγμα με το GDI στα windows

>

#include <windows.h>

int g_screenWidth;    // πλάτος και ύψος οθόνης
int g_screenHeight;
char* g_smsg = "Click me to close me!";

int InitProgram(HINSTANCE hInstance);
LRESULT _stdcall proc(HWND h, UINT msg, WPARAM wParam, LPARAM lParam);
void DrawIt(HDC hdc);

// entry point
int _stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int show)
{
MSG msg;
if (!InitProgram(hInst)) {
	MessageBox(0, "Failed to initialize application", "ERROR", MB_ICONERROR);
	return -1;
}
// κύριος βρόγχος προγράμματος
while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
return 0;
}

// αρχικοποίηση
int InitProgram(HINSTANCE hInstance)
{
WNDCLASS wc;
HWND hWnd;
const char* class_name = "circle_class";
// οι διαστάσεις της οθόνης
if (!(g_screenWidth = GetSystemMetrics(SM_CXSCREEN))) return 0;
if (!(g_screenHeight = GetSystemMetrics(SM_CYSCREEN))) return 0;

// δημιουργία της κλάσης
ZeroMemory(&wc, sizeof(WNDCLASS));
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.hInstance = hInstance;
wc.lpszClassName = class_name;
wc.hbrBackground = GetStockObject(BLACK_BRUSH); // μαύρο φόντο
wc.lpfnWndProc = (WNDPROC)proc;
wc.hCursor = LoadCursor(0, IDC_ARROW);
if (!RegisterClass(&wc)) return 0;
// και του παραθύρου (full screen)
hWnd = CreateWindow(class_name, "none", WS_POPUP, 0, 0, 
	g_screenWidth, g_screenHeight, 0, 0, hInstance, 0);

if (!hWnd) return 0;

// εμφάνιση
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
return 1;
}

// χειρισμός μηνυμάτων
LRESULT _stdcall proc(HWND h, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;

switch (msg) {
	case WM_LBUTTONDOWN:
		// με το κλικ του ποντικιού τερματισμός
		DestroyWindow(h);
		break;
	case WM_PAINT:
		hdc = BeginPaint(h, &ps);
		DrawIt(hdc);
		EndPaint(h, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
}
return DefWindowProc(h, msg, wParam, lParam);
}

// ζωγραφίζουμε στο παράθυρό μας
void DrawIt(HDC hdc)
{
RECT rct;
SIZE sz;
// Κεντράρουμε ένα παραλ/μο με πλάτος και ύψος
// το μισό του πλάτους της οθόνης
rct.left = g_screenWidth/4;
rct.top = (g_screenHeight - g_screenWidth/2)/2;
rct.right = 3*g_screenWidth/4;
rct.bottom = rct.top + g_screenWidth/2;
// άσπρη η γραμμή, μαύρο το γέμισμα
SelectObject(hdc, GetStockObject(WHITE_PEN));
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
// και ζωγραφίζουμε τον κύκλο
Ellipse(hdc, rct.left, rct.top, rct.right, rct.bottom);	
// υπολογίζουμε το ύψος και το πλάτος του κειμένου που
// θα γράψουμε και το κεντράρουμε
GetTextExtentExPoint(hdc, g_smsg, (int)strlen(g_smsg), 0, 0, 0, &sz);
rct.left = (g_screenWidth - sz.cx)/2;
rct.top = (g_screenHeight - sz.cy)/2;
// κίτρινο χρώμα σε μαύρο φόντο
SetTextColor(hdc, RGB(0xff,0xff,0));
SetBkColor(hdc, RGB(0,0,0));
// γράφουμε το κείμενο
TextOut(hdc, rct.left, rct.top, g_smsg, (int)strlen(g_smsg));
}

Δημοσ.

Ορμώμενος από το πολύ όμορφο παράδειγμα του bilco σε καθαρό Windows API, ας δούμε κάτι ανάλογο, γραμμένο σε CodeGear Turbo C++ (ή Borland C/C++ Builder 6 αν θέλετε) με την βοήθεια της βιβλιοθήκης οπτικού προγραμματισμού VCL, ώστε να μειώσουμε την πολυπλοκότητα που εμπεριέχει ο προγραμματισμός σε WinAPI.

 

>
//-Circle on MS-Windows with the use of VCL (c) Directx--------------

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered=true;		// Ask VCL to do double-buffer us (flicker free draw)
Font->Color=clWhite;		// Set form text foreground to White color
Canvas->Pen->Color=clYellow;// Set Circle color to Yellow 
Color=clBlack;				// Set form background to black
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
/*
 * During form paint, draw a Yellow colored ellipse shape within form dimensions
 * and then center strMessage with the use of WinAPI function call DrawText.
 */
static AnsiString strMessage = "Please, resize me!";
	
Canvas->Ellipse(ClientRect);
DrawText(Canvas->Handle,strMessage.c_str(),strMessage.Length(),&ClientRect,
		 DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
// Ask Windows to repaint form interior whenever resized
Invalidate();	
}
//---------------------------------------------------------------------------

 

m9d0b6n5dw0nl8uwvwq6.png

 

Υ.Γ.

Οι μέθοδοι (event) που πρέπει να δηλώσετε στον Object Inspector, διότι δεν είναι άμεσα διαθέσιμοι από το IDE (όπως το TForm1 constructor -TForm1::TForm1) στο form σας είναι οι OnPaint (βλ. ::FormPaint), OnResize (βλ. ::FormResize) του TForm μας.

Δημοσ.

σε tcl/tk είναι πιο εύκολα τα πραγματα ! :-)

 

#!/usr/bin/wish8.4

 

#mia seira keno

wm title . "kyklos"

 

canvas .cv -bg white -width 200 -height 100

pack .cv

 

.cv create oval 10 10 50 50 -outline red -width 2

 

.

post-36682-129062961099_thumb.jpg

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...