|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Temas - Amilius
1
« en: Viernes 21 de Enero de 2011, 01:17 »
El archivo adjunto contiene una breve descripcion y codigo de shaders DX9 que funcionan con Media Player Classic (MPC).
Autor: Amilius
2
« en: Lunes 29 de Enero de 2007, 17:04 »
Hola! Este fin de semana publiqué el código fuente de Artes Arcanas en Source Forge. Actualmente está publicado el código del Servidor de juego, el cliente y el editor de mapas. Artes Arcanas es un juego de rol multiusuario ambientado en un mundo mitológico/feudal. Están implementados el sistema de combate, magia, construcción de artefactos, extracción de recursos, clanes, conquista de castillos, comercio con pnjs, grupos de combate, etc. El juego MMORPG está programado en Delphi3 client/server y podrán compilarlo directamente sin instalar ningún componente adicional. Para bajar el código fuente: http://sourceforge.net/projects/artes-arcanasPara bajar los gráficos y sonidos: (Los gráficos son esenciales para correr el cliente y el editor de mapas) http://groups.msn.com/legadodelasartesarcanas
3
« en: Sábado 6 de Mayo de 2006, 03:27 »
El codigo es para .NET 2.0 (no lo probé en otros) y permite correr una aplicación en un determinado conjunto de procesadores. Algunas aplicaciones como mozilla firefox 1.0.5 tienen algunos problemas al correrlos en un procesador Intel prescott de multiples procesadores con "hyperthreading" activado. Por ejemplo una mascara "1" define que sólo correra en el primer procesador, si es "3" correrá en los dos primeros procesadores, si es "2" correrá sólo en el segundo procesador, etc. Como ven cada bit del numero corresponde a un procesador. using System; namespace StartWithAffinity { class Program { static int Main(string[] args) { if((args.Length > 3) || (args.Length < 1)) { Console.WriteLine(@">StartWithAffinity ""Filename.exe"" AffinityMask ""Params"""); return 1; } //Check file name string mFileName = args[0]; if(!System.IO.File.Exists(mFileName)) { Console.WriteLine("The provided exe file does not exists"); return 2; } //check optional mask string mMaskString = (args.Length == 2) ? args[1] : "1"; int mMask; try { mMask = Convert.ToInt32(mMaskString); } catch { Console.WriteLine("Bad mask: provide an int32 number"); return 3; } //check optional arguments string mArguments = (args.Length == 3) ? args[2] : ""; //Run the process try { System.Diagnostics.Process mProc = new System.Diagnostics.Process(); mProc.StartInfo.FileName = mFileName; mProc.StartInfo.Arguments = mArguments; mProc.Start(); mProc.ProcessorAffinity = (IntPtr)mMask; if(mArguments != "") { mProc.WaitForExit(); return mProc.ExitCode; } else return 0; } catch(Exception e) { Console.WriteLine(e); return 1000; } } } }
P.D. Agregue el codigo fuente a la parte de recursos incluyendo ejecutable que necesita el .NET framework 2.0 P.D.2 Los argumentos tienes que ponerlos entre comillas y si en los argumentos tienes comillas tienes que escribirlas como en las cadenas de C: \"
4
« en: Sábado 6 de Mayo de 2006, 02:18 »
Esta herramienta permite definir cuales procesadores puede utilizar un proceso. La hice para poder utilizar firefox 1.0.5 sin que se ande "congelando" a todo momento debido a problemas con procesadores Intel prescott con hyperthreading.
Para utilizarlo por ejemplo con el firefox basta arrastrar y soltar el firefox encima, por linea de comandos:
>StartWithAffinity "Filename.exe" Mask "Params"
"Filename.exe": Es el nombre completo con path incluido del exe.
"Mask": Es un numero entero que define en sus bits los procesadores que podrá usar el ejecutable. Por ejemplo "1" define que sólo puede usar el primer procesador, "3" define que puede usar el primero y el segundo. Si no se define este parámetro el predefinido es 1.
"Params": Los parámetros a pasar al ejecutable. (no verificado pero debería funcionar)
Autor: Sergio A. Chávez R.
5
« en: Lunes 30 de Enero de 2006, 22:34 »
Saludos, Bueno el mensaje de error que sale es este: "The designer could not be shown for this class because none of the classes within it can be designed. The designer inspected the following classes in the file..." No es el caso común donde el formulario no puede ser dibujado por que simplemente existe un error en el código. En el caso especifico use herencia en los formularios, para tener un prototipo con varias cosas implementadas y heredarlas al resto. Por alguna razon todo funciona bien pero ALGUNAS veces no puedes ver el formulario de ALGUNOS formularios heredados en tiempo de diseño. Todo funciona correctamente si haces correr el programa. Ahora explico por que me parece un bug: En la documentacion indica que al hacer modificaciones en la clase padre es necesario recompilar toda la solución. Pero aún asi el formulario no aparece en tiempo de diseño. Luego encontre un truco para volver a ver los formularios: borrar todos los uses del cs con el codigo del formulario padre, intentar compilar todo, volver a colocar los uses, compilar y salir de la aplicacion, al volver a entrar como arte de magia aparecen nuevamente todos los formularios en tiempo de diseño. En teoría no modifique el código, por que luego de volver a pegar lo que corte el código esta tal cual estaba antes. Pero obviamente algo cambio para que pudiera ver nuevamente esos formularios.
7
« en: Sábado 17 de Diciembre de 2005, 01:10 »
Este codigo muestra varios triangulos formados por vertices leidos de un archivo de texto y los colorea interpolando los valores de los vertices de acuerdo a varios tipos de interpolacion. Se puede utilizar para mostrar en forma interpolada una superficie formada por triangulos cuyos vertices representen por ejemplo tension, temperatura, etc.
El codigo utiliza la clase TDIB que adjunte anteriormente con algunos cambios adicionales.
8
« en: Jueves 3 de Noviembre de 2005, 16:31 »
Alguna vez les ha pasado que al momento de correr su aplicación c# se dan cuenta que por alguna misteriosa razón han desaparecido algunos controles de UI de su formulario?
Primero que el compilador es absolutamente incapaz de detectar que un control UI necesario para que funcione bien el programa ha sido borrado, todo compila perfectamente.
Segundo: el diseñador de formularios borra el control UI seleccionado sin pedir confirmación, esto es especialmente grave por que existen varias formas de destruir tu formulario sin que te des cuenta de ello... asi de simple.
Esto nunca me ha sucedido en delphi por una pequeña simple razón: nunca está seleccionado un control para que no puedas borrarlo accidentalmente y tiene bien separado lo que es el diseño el formulario y el código de tu aplicación. En cambio en el editor gráfico de formularios de csharp siempre esta elegido un control, muy grave error de diseño. Lo peor del asunto es que no te dan cuenta en que condenado momento perdiste esos controles de UI.
9
« en: Miércoles 24 de Agosto de 2005, 04:25 »
Abro este hilo para que se puedan publicar enlaces interesantes de mecanismos de optimización para ASM. Aqui encontrarán una buena lista de "tips" para optimizar tanto como sea posible esa parte crítica del código: (ojo que está en inglés) http://www.lxhp.in-berlin.de/lhpk6opt.htmlP.D. ¿Alguien conoce algún documento que describa si el par push/pop, o todo el código que esté dentro de este recibe algún tratamiento especial por el hardware actual, tal vez por los mecanismos de proceso multi-hilo? Hago esta pregunta por que en mediciones de rendimiento que hice pareciera que es así... por lo menos el rendimiento es mejor si el código está entre push edi push esi push ebx y sus correspondientes "pop", en lugar de preservar esos registros de otras formas, y aclaro que lo que está codificado en medio de esos push/pop no es para nada algo "ligero", sino extremadamente "pesado". (Mediciones hechas en procesadores AMD-Athlon)
10
« en: Miércoles 29 de Junio de 2005, 20:35 »
El recurso que agrego contiene una clase para poder acceder a pixeles y mostrar el bitmap en pantalla de la forma mas rapida posible usando la GDI de windows. La clase TDIB, "Bitmap independiente de dispositivo" (Delphi 3 adelante) soporta 16, 24 y 32 bits por pixel.
Los nombres de las propiedades y metodos estan en ingles para corresponder a los que comunmente son usados en delphi (create, destroy, width, height, draw, top, left, etc).
El acceso directo al area de datos de los pixeles (mediante un puntero) asegura velocidad, pero tambien es necesario tener el cuidado de no leer ni escribir fuera de esta area.
Incluyo un ejemplo de uso con un interesante efecto de colores.
P.D. por alguna razon todos los acentos que puse aparecen como "?", asi que los quite.
Autor: Sergio A. Chavez R.
11
« en: Domingo 26 de Junio de 2005, 06:32 »
Este truco es para graficar rápidamente con delphi, aplicable a juegos 2d y para tratamiento de pixeles: Esto me costó unas buenas horas de investigación con los archivos de ayuda de delphi (win32.hlp), una buena página de funciones de windows: http://www.winprog.org/tutorial y también una revisada al archivo fuente "graphics.pas". La idea es pasar lo más rápido posible un pedazo de memoria cuyos bits puedes manejar de la forma que quieras a la pantalla. Generalmente al usar Delphi esto significa tener un Tbitmap y acceder a los pixeles con el scanline. El problema es que no quería llamar al scanline (vieron todo el codigo que tiene?*) por cada línea. Tampoco llamar al .draw (vieron todo el codigo que tiene?*) cada vez que tenga que mostrar una imagen en pantalla. * Se que ese código extra le da toda la potencia y simplicidad de uso del GDI al Delphi, pero para este caso específico donde sólo tu parte de código trabaja con el bitmap y lo que más quieres es velocidad todo ese código no es pertinente. De todas formas se puede utilizar las comodidades de las clases de delphi, como el Tbitmap.loadFromFile() y copiarlo al hbitmap con el bitblt() y Tcanvas.handle para obtener el "HDC". IMPORTANTE: + EL ejemplo es para pixeles de 16 bits. + El formato de color a 16bits es A-5-5-5, 5 bits para cada canal RGB. + Hay que tener en cuenta que cada línea del bitmap DEBE estar alineado a DWORD. Si ANCHO_BMP_RENDER es múltiplo de 4 no hay problema para cualquier número de bits por pixel. Para 16bits basta que sea múltiplo de 2, pero para 24 y 8bits tiene que ser múltiplo de 4. Para 32bits no hay problema. EN EL FORMULARIO: Agregar un botón, enlazar el evento "onclick" a "Button1Click", enlazar el oncreate y ondestroy al form1. unit main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DIB, ExtCtrls; const ANCHO_BMP_RENDER=256; ALTO_BMP_RENDER=128; PIXELES_BMP_RENDER=ANCHO_BMP_RENDER*ALTO_BMP_RENDER; BYTES_BMP_RENDER=PIXELES_BMP_RENDER*2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } hdcBuffer:HDC; hbmBuffer,hbmBufferOriginal:HBITMAP; InfoBM:PBITMAPINFO; fPixeles:pointer; procedure CrearBitmapRender; procedure EliminarBitmapRender; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function GDICheck(n:integer):integer; begin result:=n; if n=0 then showmessage('Error GDI: #'+inttostr(GetLastError)); end; procedure TForm1.CrearBitmapRender; var HDCPrincipal:HDC; begin getMem(infoBM,sizeof(TBitmapInfo)); with InfoBM^,bmiHeader do begin biSize:=sizeof(TBITMAPINFOHEADER);//40 biWidth:=ANCHO_BMP_RENDER; biHeight:=-ALTO_BMP_RENDER;//Para un Bitmap "TOP->DOWN" biPlanes:=1; biBitCount:=16; biCompression:=0; biSizeImage:=BYTES_BMP_RENDER; biXPelsPerMeter:=0; biYPelsPerMeter:=0; biClrUsed:=0; biClrImportant:=0; end; HDCPrincipal:=getDC(handle); if longbool(HDCPrincipal) then begin hdcBuffer:=CreateCompatibleDC(HDCPrincipal); hbmBuffer:=GDICheck(CreateDIBSection(hdcBuffer,InfoBM^,DIB_RGB_COLORS,fPixeles,0,0)); hbmBufferOriginal := SelectObject(hdcBuffer, hbmBuffer);//Viene con uno que no usaremos releaseDC(handle,HDCPrincipal); end; end; procedure TForm1.EliminarBitmapRender; begin if (hdcBuffer<>0) then begin SelectObject(hdcBuffer, hbmBufferOriginal);//Para que sea eliminado junto con el hbitmap DeleteDC(hdcBuffer); end; if (hbmBuffer<>0) then DeleteObject(hbmBuffer); if InfoBM<>nil then freemem(InfoBM); end; procedure TForm1.FormCreate(Sender: TObject); begin CrearBitmapRender; end; procedure TForm1.Button1Click(Sender: TObject); type TPixeles=array[0..ALTO_BMP_RENDER-1,0..ANCHO_BMP_RENDER-1] of word; PPixeles=^TPixeles; TPixeles2=array[0..PIXELES_BMP_RENDER-1] of word; PPixeles2=^TPixeles2; var i:integer; begin //Tres formas de acceder a los pixeles for i:=0 to 5000 do PPixeles(fPixeles)[random(ALTO_BMP_RENDER),random(ANCHO_BMP_RENDER)]:=random(32); for i:=0 to 5000 do PPixeles2(fPixeles)[random(PIXELES_BMP_RENDER)]:=random(32) shl 5; for i:=0 to 5000 do word(pointer(integer(fPixeles)+(random(PIXELES_BMP_RENDER) shl 1))^):=random(32) shl 10; BitBlt(canvas.handle, 0, 0, ANCHO_BMP_RENDER, ALTO_BMP_RENDER, hdcBuffer, 0, 0, SRCCOPY); end; procedure TForm1.FormDestroy(Sender: TObject); begin EliminarBitmapRender; end; procedure TForm1.FormPaint(Sender: TObject); begin BitBlt(canvas.handle,0,0, ANCHO_BMP_RENDER, ALTO_BMP_RENDER, hdcBuffer, 0, 0, SRCCOPY); end; end.
12
« en: Domingo 19 de Junio de 2005, 23:18 »
Publico este enlace a una valiosa herramienta GRATUITA para compiladores de la familia Borland: http://www.automatedqa.com/downloads/memproof/A partir de tu .exe informa detalladamente cuanta memoria no has liberado, cuantos ".free" o "freemem" olvidaste.
13
« en: Miércoles 17 de Noviembre de 2004, 05:22 »
El clásico Sokoban de Hiroyuki Imabayashi programado para delphi3. ¿Quien no ha jugado una partida? Puedes cambiar los gráficos, la música (midis bastante conocidos) y lo mejor es que lee archivos estándar que puedes bajar de internet y jugar los niveles más complicados que puedas encontrar. Tiene "undo" para miles de movimientos.
* El código muestra como realizar algunos efectos gráficos usando sólo la GDI de windows y como usar directamente el bitblt.
* El código está dividido en dos partes: interfaz y las clases propiamente del juego.
* Adjuntado el ejecutable para los que no tengan el compilador.
Autor: Sergio A. Chávez R.
14
« en: Jueves 21 de Octubre de 2004, 00:09 »
La verdad que no creia que se pudieran hacer este tipo de juegos en flash y que además sean de tamaño razonable. (El juego ocupa casi 2MB que los valen bit a bit.) Seguramente alguien ya lo vio por que ya hace 2 años que lo terminaron, pero para los que no lo vieron ahi va: [Play this game] http://www.newgrounds.com/portal/view.php?id=73449
15
« en: Martes 12 de Octubre de 2004, 22:55 »
Esta ves si que se pasaron... Con sólo abrir una página web maliciosa o ver un email con un jpeg "preparado" pueden ejecutar código en tu máquina XP. Más información en: (Incluye una enorme lista de parches que habrá que instalar...) http://www.securiteam.com/windowsntfocus/5VP0H1FE0W.html ---------------- OTRA FALLA DE SEGURIDAD: Encontré esta página cuando buscaba parches para otra vulnerabilidad con los .gif "bomba". Al parecer el XP al tratar de obtener información del encabezado abre el .gif basta solo señalar el archivo, ni es necesario abrirlo y boom: ERROR EN EL EXPLORER, se cierra el explorer y espero que eso sea todo lo que pasa.
16
« en: Martes 5 de Octubre de 2004, 18:42 »
Pasos a seguir: 1.- Evita infra-utilizar bibliotecas de funciones. Si sólo deseas abrir archivos .gif estáticos, busca un componente que sólo realize esa función y no uno que además comprima y los anime. Ten cuidado con bibliotecas que adosan al ejecutable imágenes y otros tipos de datos que posiblemente no vayas a utilizar. 2.- Al momento de compilar la aplicación asegurate de eliminar toda la información para debug configurando las opciones de compilación para que no genere esta información para la versión a distribuir. 3.- Eliminar el "relocation section" del ".exe". Este es necesario para los .dll pero no pare el ".exe". Utiliza esta herramienta: (Viene con código fuente bajo licencia open source para delphi 5) http://www.jrsoftware.org/striprlc.php4.- Hasta este paso sólo se quitaron partes no funcionales del archivo ejecutable. El siguiente paso es comprimir la información funcional del ejecutable, utiliza esta herramienta que también viene bajo licencia open source: (No la uses indiscriminadamente en ejecutables ajenos, puede ser que el ejecutable necesite su estructura de archivo intactacta por X o Z razón. Por supuesto tu sabes si tu ejecutable lee su mismo archivo ".exe" para buscar alguna información.) http://upx.sourceforge.net/Finalmente tienes un archivo ejecutable comprimido. Ventajas: + Un +-10% de ganancia de compresión respecto al .rar .zip para fines de distribución por internet. + El código está algo más protegido de hackers no profesionales al estar comprimido. + El ejecutable final ocupa menos espacio en disco. Desventajas: - Al momento de ejecutar la aplicación se descomprime todo el ejecutable en memoria, lo que consume una fracción de segundo y la misma cantidad de memoria extra del tamaño no comprimido del ejecutable. En la actualidad estas desventajas no son notadas por el usuario final, hagan la prueba, corran ambas versiones de sus ejecutables y verán que no existe diferencia palpable para el usuario final.
17
« en: Domingo 3 de Octubre de 2004, 05:47 »
Si conoces la contraseña de otro administrador activo en la máquina puedes resetear la contraseña olvidada de otro usuario o administrador. Si no existe otra cuenta de administrador cuya contraseña recuerdes entonces tendrás que resetear la contraseña mediante estos pasos que incluyen crear un disco de arranque especial, para lo cual tendrás que configurar el bios para que el sistema pueda arrancar desde disquetera. Esto sólo se debe aplicar como última medida desesperada si no recuerdas la contraseña del único administrador activado, antes de proceder a usar otro disco de arranque y reinstalar todo. Todos los archivos cifrados se perderán (no podrán ser descifrados) al momento de "resetear" la contraseña (igual sucede si teniendo otra cuenta de administrador "reseteas" la contraseña de otro usuario). Nota Importante:Esto no es para "jugar", ¿Recuerdan que es la última opcion antes de reinstalar el windows XP y todos los programas? Pues eso significa que si algo sale mal (por ejemplo por la versión del sistema operativo, tipo de sistema de archivos, tipo de partición de hd.) tendrán que seguir con el plan original y reinstalar el xp y todos los programas. A continuacion copypasteo los pasos a seguir para resetear la contraseña: Bajar el archivo : bd040116.zip
1-Pasas el contenido de bd040116.zip al diskette. Para ello ejecutas install.bat. Y cuando te pide el "target" pones A:/ y le das a enter. Luego metes un diskette en la diskettera y le vuelves a dar a ENTER. Cuando termine te dira DONE!, y que reinicies el güindows. 2-Lo metes en tu PC y reinicias 3-Al terminar de cargar el mini-linux (tranquilo que cuando todo acabe seguirás teniendo el WinXP, ya que el mini-linux no se instala en el dd) te saldrá una pantalla con las particiones que tiene hechas tu disco duro (en adelante dd). Bien, si sólamente tienes una, la cosa es bien sencilla, pulsas 1 y despues ENTER. Si tienes 2 o mas particiones, tendrás que buscar en quel esta instalada el S.O., debería de estar en una que ponga boot... 4-Nos pide la ruta de donde estael registro del sistema operativo windows, que por defecto es "winnt/system32/config", asi que si no lo has tocado, será esa... Entonces metes la ruta que te he puesto y le das a ENTER. 5-Ahora verás que nos sale un listado de opciones. Pues bueno, tu tienes que darle al 1 y después a ENTER (1-Password Reset) 6-Más opciones...Nada, nada, tu a lo tuyo. Le das al 1 y después al ENTER (1-Edit user data and password. Seguidamente te aparecerá el listado de usuarios que usan el ordenador. 7-Normalmente, el primer usuario de la lista, es el Administrador, así que le das a ENTER y ya está. Si quisieras cambiar, dále al número que tiene el Usuario y depués al ENTER. Por ejemplo: 1-Administrador 2-Invitado 3-Juanito Pues para entrar a Juanito, tienes que pulsar 3 y ENTER. 8-Ahora te saldrán unos cuantos datos del usuario, y abajo del todo, nos dice que pongamos un nuevo password. Pues bien, si quieres eliminar el password, simplemente pones * y le das a ENTER. Si la quisieras cambiar simplemente pones la contraseña nueva, y le das al ENTER. 9-Ahora te pregunta si realmente quieres cambiar el password, tu si que quieres ¿no? .Pulsas la tecla "y" y ahora pulsas enter. 10-Bien, esto de ahora es importante, ya que si no no cambiara/eliminara el password. Pulsamos Shift + 1 para que nos salga el signo de exclamación (!) , y despues ENTER. 11-Ahora estamos en el menú principal. La opción que guardará los cambios es la última, Quit. Pues ala, pulsas la tecla q y le das a ENTER. Nos pedirá la confirmación. Pues le das a la "y" y ENTER. Podrás ver el proceso en pantalla. Si sale OK al lado de las líneas es que todo ha ido bien y solo queda sacer el diskette y reiniciar windows, y si no le has puesto contraseña, escribes Administrador y le das a ENTER, y si le has puesto pass la escribes, y en teoría, si lo has hecho todo bien, ya tienes tu problema arreglado.
18
« en: Martes 14 de Septiembre de 2004, 02:26 »
Saludos a todos los miembros del foro. Los invito cordialmente a bajar la nueva versión del juego de rol en línea que estoy desarrollando de la dirección: http://groups.msn.com/legadodelasartesarcanasNota: Es necesario hacerse miembro para bajar los archivos.
19
« en: Domingo 5 de Septiembre de 2004, 17:08 »
Adjunto una carta de respuesta conteniendo el código en el buen DELPHI para realizar rotación con antialisado. Si alguien consigue un componente para delphi o mejor un método para una clase heredada del Tbitmap sea bienvenido!!!. Verán que el nivel de complejidad de la operación a nivel de pixel es elevado, un montón de multiplicaciones y saltos (if). From: Harm <harmans@uswest.net> Subject: Re: 2d rotaion trouble! Date: 28 Mar 1999 00:00:00 GMT Message-ID: <36FE5D74.C74E566C@uswest.net> Content-Transfer-Encoding: 7bit References: <e5bL2.456$Xc6.578@news.get2net.dk> Content-Type: text/plain; charset=us-ascii X-Complaints-To: harmans@uswest.net NNTP-Posting-Date: Sun, 28 Mar 1999 10:48:22 CDT Newsgroups: comp.graphics.algorithms Here's Delphi pascal code to rotate an image any angle, with edge wrapping, and anti-aliasing. Converted and added the edge wrapping, from original VB code by Rod Stephens. At least it wasn't (shudder) C++. :) procedure TForm1.RotateAngle(Angle: integer); var Theta, cosTheta, sinTheta: Single; cx, cy : Single; //Center X, Y sfrom_y, sfrom_x : Single; //Real number ifrom_y, ifrom_x : Integer; //Integer version to_y, to_x : Integer; weight_x, weight_y : array[0..1] of Single; weight : Single; new_red, new_green : Integer; new_blue : Integer; total_red, total_green : Single; total_blue : Single; ix, iy : Integer; pb, pc : pRGBArray; begin Screen.Cursor := crHourGlass; CopyMe(ud,b); //Copy to the undo bitmap CopyMe(tBufr,b); //Copy to the internal buffer bitmap // Calculate the sine and cosine of theta for later. Theta:=-(Angle)*Pi/180; sinTheta:=Sin(Theta); cosTheta:=Cos(Theta); cx := b.Width / 2; //Center of rotation for x cy := b.Height / 2; //Center of rotation for y // Perform the rotation. for to_y := 0 to b.Height-1 do begin for to_x := 0 to b.Width-1 do begin // Find the location (from_x, from_y) that // rotates to position (to_x, to_y). sfrom_x := cx + (to_x - cx) * cosTheta - (to_y - cy) * sinTheta; ifrom_x := Trunc(sfrom_x); sfrom_y := cy + (to_x - cx) * sinTheta + (to_y - cy) * cosTheta; ifrom_y := Trunc(sfrom_y); // Calculate the weights. if sfrom_y >= 0 then begin weight_y[1] := sfrom_y - ifrom_y; weight_y[0] := 1 - weight_y[1]; end else begin weight_y[0] := -(sfrom_y - ifrom_y); weight_y[1] := 1 - weight_y[0]; end; if sfrom_x >= 0 then begin weight_x[1] := sfrom_x - ifrom_x; weight_x[0] := 1 - weight_x[1]; end else begin weight_x[0] := -(sfrom_x - ifrom_x); Weight_x[1] := 1 - weight_x[0]; end; if ifrom_x < 0 then ifrom_x := b.Width -1-(-ifrom_x mod b.Width) else if ifrom_x > b.Width-1 then ifrom_x := ifrom_x mod b.Width; if ifrom_y < 0 then ifrom_y := b.Height -1-(-ifrom_y mod b.Height) else if ifrom_y > b.Height-1 then ifrom_y := ifrom_y mod b.Height; // Average the color components of the four // nearest pixels in from_canvas. total_red := 0.0; total_green := 0.0; total_blue := 0.0; for ix := 0 to 1 do begin for iy := 0 to 1 do begin if ifrom_y + iy < b.Height then pc := tBufr.ScanLine[ifrom_y + iy] else pc := tBufr.ScanLine[b.Height - ifrom_y - iy]; if ifrom_x + ix < b.Width then begin new_red := pc[ifrom_x + ix].rgbtRed; new_green := pc[ifrom_x + ix].rgbtGreen; new_blue := pc[ifrom_x + ix].rgbtBlue; weight := weight_x[ix] * weight_y[iy]; total_red := total_red + new_red * weight; total_green := total_green + new_green * weight; total_blue := total_blue + new_blue * weight; end else begin new_red := pc[b.Width - ifrom_x - ix].rgbtRed; new_green := pc[b.Width - ifrom_x - ix].rgbtGreen; new_blue := pc[b.Width - ifrom_x - ix].rgbtBlue; weight := weight_x[ix] * weight_y[iy]; total_red := total_red + new_red * weight; total_green := total_green + new_green * weight; total_blue := total_blue + new_blue * weight; end; end; end; pb := b.ScanLine[to_y]; pb[to_x].rgbtRed := Round(total_red); pb[to_x].rgbtGreen := Round(total_green); pb[to_x].rgbtBlue := Round(total_blue); end; end; imSine.Picture.Assign(b); //all done, assign the bmp to our image Screen.Cursor := crDefault; end; morphix wrote: > I have some problems figuring how to do a 2d rotation on an image. The > resulting image has blank pixels (holes that isn't filled with color) > could anybody please show me an algorithm that works, (pascal, c, c++ or > pseudo) > > Morphix -- Harmans Omaha NE
20
« en: Domingo 5 de Septiembre de 2004, 16:19 »
Sobre 15,16,24 y 32 bits: =============== La ventaja del modo de 15 y 16 bits es el ahorro del 50% memoria (incluyendo el bono extra por reducir al 50% la transferencia de memoria), prácticamente sin tener deterioro visible en la calidad de la imagen salvo zonas de gradiente bajo de las texturas (que es contrarrestable con el conocimiento de las técnicas adecuadas de difusión). Bit15 Bit0 ?RRRRRGGGGGBBBBB (15 bits) 5 bits para cada canal, ventaja para optimización, menos calidad visual que en el modo de 16 bits, más ventajas al momento de optimizar. Bit15 Bit0 RRRRRGGGGGGBBBBB (16 bits) Un bit más para el canal verde por que es el color que mejor vemos los humanos, comparando al rojo y azul. La calidad de la imagen mejora notablemente. Tomemos la ecuación de nivel de percepción de colores al ojo humano: Y = 0.299 R + 0.587 G + 0.114 B Diferencia entre 15 y 16 bits: Datos iniciales: Error para 32 niveles de escala de grises= +-4 niveles como máximo (ojo mitad de 8, 8x32=256), lo que corresponde a un 1.5625% Para 8 bits=0%, (Por que vemos menos de 256 niveles de escala de grises normalizados). Error en 15 bits: 1.5625%( 0.299 + 0.587 + 0.114 )= 1.5625% Error en 16 bits: 1.5625%( 0.299 + 0.114 )+ 0.78125%( 0.587)= 1.096875% Error en 24 bits: 0% Error en 32 bits: 0% (8 bits utilizados generalmente como "canal alpha") Como ven, aumentar ese pequeño bit disminuye el error al 70% del error que teníamos en 15 bits. No duden que el modo de 16 bits seguirá siendo utilizado para almacenar texturas en memoria. Siempre será mejor tener 1% de error en calidad visual para tener el doble de variedad de texturas al mismo costo de consumo de memoria. Nota: Algunas tarjetas de bajo costo excluyen el modo de 15 bits, otras tarjetas antiguas no soportan el modo de 16 bits pero si el modo de 15bits, como las ATI de 8MB.
21
« en: Martes 29 de Junio de 2004, 18:53 »
Es un juego de conquista espacial, bastante popular (14810 jugadores!), no es necesario ninguna descarga (basado en web) y bastan unos 5 minutos por día para jugarlo: Sólo es necesario indicar tu login, password para el juego y un email donde llegará un link de activación de cuenta para comenzar tu imperio galáctico: http://www.astrowars.com/register/?r=54028Nota: quedan unos 12 días de la ronda actual, ideal para aprender a jugarlo y prepararse para la siguiente ronda de 3 meses y tratar de llegar a los mayores puntajes en población, armada espacial, planetas controlados, etc.
22
« en: Domingo 20 de Junio de 2004, 07:28 »
Estoy seguro que estos MIDIS traeran viejos recuerdos a la memoria...
Disfrutenlos y espero que su tarjeta de sonido haga justicia a estos archivos.
Son midis bantante bien hechos de juegos antiguos.
23
« en: Domingo 20 de Junio de 2004, 06:48 »
Saludos. Adjunto el código fuente de un 5 en raya sencillo que hice para Delphi3. A ver si le ganan a la computadora al primer intento... NOTA: la anterior versión tenía un bug: si la computadora comenzaba primero no se generaba la primera movida y al momento de mostrar la jugada daba error de rango. P.D. Mejore el estilo del código ya que el anterior estaba un asco.
24
« en: Jueves 10 de Junio de 2004, 19:31 »
Este juego es bastante sencillo y basado en el juego "Aventura" para gwbasic: Tienes una nave. Tienes que destruir a todos los invasores antes del tiempo límite. Puedes lanzar un rayo "destructor" o misiles. Puedes reparar tu nave y cargar nuevos misiles en las bases estelares. La diferencia es que el juego original era por turnos, y esta versíon no lo es, para darle más emoción al juego. P.D. Tal vez funcione con otras versiones de Delphi. Si no tienen el winrar, pueden bajarlo de: http://www.rarsoft.com/download.htm
25
« en: Domingo 6 de Junio de 2004, 04:21 »
¿Alquien ya trabajó con esta biblioteca de funciones open source para acelerar el alpha blending? http://sourceforge.net/projects/fblend/Básicamente está orientado a los que deseen realizar efectos especials en 15 ,16 y 32 bpp. Asegura ser de 2 a 14 veces más rápido que Allegro.
|
|
|