Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 945845
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T22:49:06+00:00 2026-05-15T22:49:06+00:00

I’m currently trying to create a ray tracer in C++ but I’m having difficulty

  • 0

I’m currently trying to create a ray tracer in C++ but I’m having difficulty writing the .bmp produced at the end. I’m determined to do it manually, so I can learn more about image files and writing them etc. But I’m having some difficulty. I’m fairly new to C++ but have been using Python for a while.

I’m almost there now, I just have one strange problem. Everything is correct up to mid way trough the important colours (which I set to 0), where all sorts of random characters spring up and this continues for the next few bytes, a couple of bytes in to the pixel data. Before and after that everything is fine, but I just can’t explain it. My current code is in the edit:

Here is the hex:

http://yfrog.com/j3picture1equp

the problem area is highlighted

 #include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
//-------------------------Object list
const int renderSize[2] = {254,254};
float sphere1Pos[3] = {0.0,0.0,0.0}; //first sphere at origin to make calculations easier
float sphere1Radius = 10.0;
float sphere1Colour= (255.0,0.0,0.0); 
float light1Pos = (0.0,20.0,0.0); //Above sphere
float light1Intensity = 0.5;
// ------------------------



float dot(float* a,float* b); //Calculates the dot product

struct pixel {

    unsigned char R;
    unsigned char G;
    unsigned char B;
    };

//bmp--------------
struct bitmapMagicNumber {
    unsigned char magicNumber[2];
    };

struct bitmapFileHeader {
    unsigned char fileSize;
    short reserved1;
    long reserved2;
    short offset;
    };

struct bitmapInformationHeader {
    short headerSize;
    short padding;
    short width;
    short height; 
    short planes;
    short bitDepth;
    short compression;
    short imageSize;
    short xPixelsPerMetre;
    short yPixelsPerMetre;
    short colours;
    short importantColours;
    };

void setBitmapMagicNumber(bitmapMagicNumber& magicNum){
    magicNum.magicNumber[0] = 0x42;
    magicNum.magicNumber[1] = 0x4D;
    };

void setBitmapFileHeader(bitmapFileHeader& fileHeader,bitmapInformationHeader& informationHeader,pixel pixelArray) {
    fileHeader.fileSize = 54 + sizeof(pixelArray);
    fileHeader.reserved1 = 0;
    fileHeader.reserved2 = 0;
    fileHeader.offset = 54;
    };

void setBitmapInformationHeader(bitmapInformationHeader& informationHeader){
    informationHeader.headerSize = 40;
    informationHeader.padding=0;
    informationHeader.width = renderSize[0];
    informationHeader.height = renderSize[1];
    informationHeader.planes = 1;
    informationHeader.bitDepth = 24;
    informationHeader.compression = 0;
    informationHeader.imageSize = 0;
    informationHeader.xPixelsPerMetre = 0;
    informationHeader.yPixelsPerMetre = 0 ;
    informationHeader.colours = 0;
    informationHeader.importantColours = 0;
    };

void writeBitmap(bitmapMagicNumber& magicNum, bitmapFileHeader& fileHeader,bitmapInformationHeader& informationHeader,pixel pixelArray){
    ofstream out("test.bmp",ios::out|ios::binary);

    //file header
    out.write((char*) &magicNum,2);
    out.write((char*) &fileHeader.fileSize,sizeof(fileHeader.fileSize));
    if (sizeof(fileHeader.fileSize)<3){
        out.write((char*) &informationHeader.padding,1);
        }
    out.write((char*) &informationHeader.padding,1);
    out.write((char*) &fileHeader.reserved1,2);
    out.write((char*) &fileHeader.reserved2,2);
    out.write((char*) &fileHeader.offset,sizeof(fileHeader.offset));
    out.write((char*) &informationHeader.padding,1);
    out.write((char*) &informationHeader.padding,1);


    //information header
    out.write((char*) &informationHeader.headerSize,sizeof(informationHeader.headerSize));
    out.write((char*) &informationHeader.padding,1);
    out.write((char*) &informationHeader.padding,1);



    out.write((char*) &informationHeader.width,sizeof(informationHeader.width));
    if (sizeof(informationHeader.width)<4){
        out.write((char*) &informationHeader.padding,1);
        }
    if (sizeof(informationHeader.width)<3){
        out.write((char*) &informationHeader.padding,1);
        }
    if (sizeof(informationHeader.width)<2){
        out.write((char*) &informationHeader.padding,1);
        }

    out.write((char*) &informationHeader.height,sizeof(informationHeader.height));
    if (sizeof(informationHeader.height)<4){
        out.write((char*) &informationHeader.padding,1);
        }
    if (sizeof(informationHeader.height)<3){
        out.write((char*) &informationHeader.padding,1);
        }
    if (sizeof(informationHeader.height)<2){
        out.write((char*) &informationHeader.padding,1);
        }   

    out.write((char*) &informationHeader.planes,sizeof(informationHeader.planes));
    out.write((char*) &informationHeader.bitDepth,sizeof(informationHeader.bitDepth));
    out.write((char*) &informationHeader.compression,4);
    out.write((char*) &informationHeader.imageSize,4);
    out.write((char*) &informationHeader.xPixelsPerMetre,4);
    out.write((char*) &informationHeader.yPixelsPerMetre,4);
    out.write((char*) &informationHeader.colours,4);
    out.write((char*) &informationHeader.importantColours,4);

    //pixel data
    for (int y=0; y < renderSize[1]; y++) {
        for (int x=0; x< renderSize[0]; x++) {
            out.write((char*) &pixelArray[x][y],sizeof(pixel));
        }
    }

    out.close();


}


// end bmp-----------

int main() {

pixel pixelArray[renderSize[0]][renderSize[1]];

    for (int y=0; y < renderSize[1]; y++) {
        for (int x=0; x< renderSize[0]; x++) {
            float rayPos[3] = {x,y, -1000.0};
            float rayDir[3] = {0.0,0.0,-1.0};   
            bool intersect;

            //for each object in scene, see if intersects. (for now there is only one object to make things easier)

            //-------sphere ray intersection....
            float distance[3];
            distance[0]= rayPos[0]-sphere1Pos[0];
            distance[1]= rayPos[1]-sphere1Pos[1];
            distance[2]= rayPos[2]-sphere1Pos[2];
            float a = dot(rayDir, rayDir);
            float b = 2 * dot(rayDir, distance);
            float c = dot(distance, distance) - (sphere1Radius * sphere1Radius);

            float disc = b * b - 4 * a * c;

            if (disc < 0)
                intersect=false;
            else
                intersect=true;


            //--------------------

            if (intersect==true){
                pixelArray[x][y].R = 0;
                pixelArray[x][y].G = 0;
                pixelArray[x][y].B = 0;
                }

            else {
                pixelArray[x][y].R = 0;
                pixelArray[x][y].G = 0;
                pixelArray[x][y].B = 0;
                }



            // trace to lights (as long as another object is not in the way) 

        }

    }
    //write .bmp
    bitmapMagicNumber magicNum;
    bitmapFileHeader fileHeader;
    bitmapInformationHeader informationHeader;

    setBitmapMagicNumber(magicNum);
    setBitmapFileHeader(fileHeader,informationHeader, pixelArray[renderSize[0]][renderSize[1]]);
    setBitmapInformationHeader(informationHeader);

    writeBitmap(magicNum,fileHeader,informationHeader, pixelArray[renderSize[0]][renderSize[1]]);
}

//calculate dot product
float dot(float* a,float* b)
{
float dp = 0.0;
for (int i=0;i<3;i++)
    dp += a[i] * b[i];
return dp;
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T22:49:07+00:00Added an answer on May 15, 2026 at 10:49 pm

    While it may not be your only issue, you almost certainly have data alignment issues.

    In your bitmapFileHeader, for example, assuming long has four-byte alignment and short has two-byte alignment, there will be two bytes of unnamed padding between magicNumber and fileSize (there are similar issues in most of the other data structures).

    As a solution, you can represent the header and other structures as an array of char (which has no padding) and copy the relevant data into the correct locations in the array.

    Your compiler might provide a way to “pack” the data structures so that they are unaligned, which can also solve your problem, but doing so is wholly unportable.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

link Im having trouble converting the html entites into html characters, (&# 8217;) i
Basically, what I'm trying to create is a page of div tags, each has
I'm trying to create an if statement in PHP that prevents a single post
I want to count how many characters a certain string has in PHP, but
I am trying to understand how to use SyndicationItem to display feed which is
I have a string like this: La Torre Eiffel paragonata all&#8217;Everest What PHP function
I want use html5's new tag to play a wav file (currently only supported
I have a French site that I want to parse, but am running into
I am trying to render a haml file in a javascript response like so:
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.