Xhin Posted August 5, 2012 Posted August 5, 2012 Basically, I wrote a cool plugin a few days ago, but in the testing process, I set it up so it only worked on 800x600 canvases. There's a value called Amount1 that will pick a section of the X canvas, so it goes from 0 to 800. Obviously this doesn't work in all cases, so what I've been trying to do is make Amount1 instead be a percentage which is calculated into a pixel amount. So for example, if Amount1 = 50; and the canvas size is 800x600, then Amount1 will be converted to 400. If Amount1 = 50; and the canvas size is 233x600, then Amount1 should round down to 116. This should be very simple. Instead, I keep running into conversion problems. If I get those right somehow (by affixing an (int) or (double) or whatever), then the results aren't what they're supposed to be, I get absurdly large numbers, and the entire program fails. For example, Amount1 = 60; CenterX = 400; (Canvas size is 800x600). I run: Amount1 = (Amount1*CenterX*2)/100; This should be 480. In fact, running if (Amount1 == 480) { <insert stuff I use to debug with here> } proves that it's 480. But for some reason setting Amount1 by the code above and setting it by a simple "Amount1 = 480;" are completely different. It's not a type problem, since the same thing happens if I do: Amount1 = (int)((Amount1*CenterX*2)/100); it also happens if I do Amount1 *= (CenterX*2); Amount1 /= 100; or if I set Amount1 equal to 1/100th of itself (as a double) and simply multiply it by CenterX*2 and reconvert to (int). What's weird is the absurdly large number I get when the system throws an error message: "System.ArgumentOutOfRangeException: Coordinates out of range, max={Width:799, Height=599{Parameter name: (x,y)Actual value was {X=-6039228,Y=19}." What am I missing here? I've been trying to fix this for hours without success. Quote
Ego Eram Reputo Posted August 5, 2012 Posted August 5, 2012 Useful for calculating the centre of an image/selection: // Rectangle selection = this.EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt(); // long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left); // long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top); (Find these code samples and MANY more at www.BoltBait.com) Now you can multiply the results by your % slider value. Quote ebook: Mastering Paint.NET | resources: Plugin Index | Stereogram Tut | proud supporter of Codelab plugins: EER's Plugin Pack | Planetoid | StickMan | WhichSymbol+ | Dr Scott's Markup Renderer | CSV Filetype | dwarf horde plugins: Plugin Browser | ShapeMaker
Xhin Posted August 5, 2012 Author Posted August 5, 2012 Dude, that's in my code. That's the CenterX value I have in my code. The problem is that the actual percentage calculation won't work right. Quote
Red ochre Posted August 5, 2012 Posted August 5, 2012 Hi Xhin, It looks like you're forgetting to add in the 'selection.Left ' bit. (perhaps that's overly simplistic). Looks like you are assuming that centreX = 400 on an 800 wide canvas, it probably isn't. (so you may need to subract selection.left from your numbers before doing any calculation - then add it back in before giving a value to the dst pixel). It can get confusing! - I sometimes add a little 'if' statement to protect against out of bounds exeptions - so at least the plugin runs and I can see where I've gone wrong. eg if(X >= rect.Left && X < rect.Right){} I've put my codelab source code for 'squirkle' here : http://forums.getpai...23194-squirkle/ That has some code for positioning things on the canvas, that may be useful to read. Good luck - perseverance is sometimes the most useful skill. Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
Rick Brewster Posted August 5, 2012 Posted August 5, 2012 You're probably overflowing the integers. Switch to long, aka System.Int64, and the problems will probably become more apparent. Quote The Paint.NET Blog: https://blog.getpaint.net/ Donations are always appreciated! https://www.getpaint.net/donate.html
Ego Eram Reputo Posted August 6, 2012 Posted August 6, 2012 Here's some code I used for the Polaroid Frame plugin. It uses integer math to work out % sizes // Delete these 2 lines if you don't need to know the center point of the current selection double px = ( Amount2.First +1 ) / 2 ; double py = ( Amount2.Second + 1 ) / 2; int CenterX = (int)Math.Round ( px * ( selection.Right - selection.Left ) ) ; int CenterY = (int)Math.Round ( py * ( selection.Bottom - selection.Top ) ) ; // Delete these lines if you don't need the primary or secondary color ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor; ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor; // ColorBgra FrameColor; ColorBgra Pix; // Specific variables // int FrmHeight = Amount1 * 1350 / 1000; // 135% of img height // int FrmWidth = Amount1 * 1100 / 1000; // 110% of img height int FrmTop = CenterY - ( Amount1 * 1350 / 2000); int FrmBtm = CenterY + ( Amount1 * 1350 / 2000); int FrmLt = CenterX - ( Amount1 * 1100 / 2000); int FrmRt = CenterX + ( Amount1 * 1100 / 2000); // int TopBorder = Amount1 * 75 / 1000; // 7.5% of img height // int ImgHeight = Amount1; // Image Height // int ImgWidth = Amount1 * 975 / 1000; // 97.5% of img height int ImgTop = FrmTop + (Amount1 * 75 / 1000); int ImgBtm = ImgTop + ( Amount1 / 2 * 2 ); // CHECK Binary OP!! int ImgLt = CenterX - ( Amount1 * 975 / 2000 ); int ImgRt = CenterX + ( Amount1 * 975 / 2000 ); note: I'm dividing by 2000 to get half of the stated % (i.e. the distance from the center point) Quote ebook: Mastering Paint.NET | resources: Plugin Index | Stereogram Tut | proud supporter of Codelab plugins: EER's Plugin Pack | Planetoid | StickMan | WhichSymbol+ | Dr Scott's Markup Renderer | CSV Filetype | dwarf horde plugins: Plugin Browser | ShapeMaker
Simon Brown Posted August 11, 2012 Posted August 11, 2012 Is Amount1 a global variable from CodeLab that represents a control value? Given that the render function is called hundreds (?) of times by Paint.NET, each time it is run the variable could be being increased, causing it to overflow. Quote
BoltBait Posted August 11, 2012 Posted August 11, 2012 Don't ever change the value of Amount1. That is for Paint.NET/Codelab to manage. Please create a new variable to hold your calculated value. Quote Download: BoltBait's Plugin Pack | CodeLab | and a Free Computer Dominos Game
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.